数据密集型应用系统设计 - 关于 Apache Avro 的疑问

2020-08-01 22:34:01 +08:00
 JasonLaw

在“Designing Data-Intensive Applications - CHAPTER 4 Encoding and Evolution - Formats for Encoding Data - Avro”中,举例展示了 Avro 如何进行编码。

示例记录如下:

{
   "userName": "Martin",
   "favoriteNumber": 1337,
   "interests": ["daydreaming", "hacking"]
}

使用 Avro 编写的示例模式如下:

record Person {
   string userName;
   union { null, long } favoriteNumber = null;
   array<string> interests;
}

示例记录被 Avro 编码之后为:

我的疑问

  1. 第一个字节0x0c的最后一位代表 sign,sign 是什么呢?
  2. 第八个字节0x02代表union branch 1 (long, not null),怎么理解union branch 1 (long, not null)

P.S. 因为是第一次接触 Avro,不太清楚应该怎么搜索相关信息,说实话,不太应该提这样的问题。

1971 次点击
所在节点    程序员
3 条回复
gfreezy
2020-08-01 22:50:37 +08:00
应该看下 avro 具体怎么序列化的,感觉是类似 varint 的编码方式
JasonLaw
2020-08-01 22:58:22 +08:00
@gfreezy 我好像明白了。sign 代表是不是还要考虑接下来的字节。union branch 1 (long, not null)代表类型是 long,因为 branch 0 是 null,所以 long 是 branch 1 。但是我不太确定自己的理解是否正确。明天再仔细看看。
ky11223344
2020-08-02 00:20:03 +08:00
sign 就是这个数是正数还是负数,这里是 0 就是指这个数是正数,每个 byte 第一个 bit 是 1 表示还有后续 byte,即这个数还要更多 byte 才能表示完整,0 表示没有后续,是最后一个 byte 了,我记得书上这个位置附近有相关解释是这样讲的,至于 union branch 我也不知道。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/694910

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX