首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JasonLaw
V2EX  ›  程序员

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

  •  
  •   JasonLaw · 4 天前 · 504 次点击

    在“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,不太清楚应该怎么搜索相关信息,说实话,不太应该提这样的问题。

    3 条回复    2020-08-02 00:20:03 +08:00
    gfreezy
        1
    gfreezy   4 天前
    应该看下 avro 具体怎么序列化的,感觉是类似 varint 的编码方式
    JasonLaw
        2
    JasonLaw   4 天前 via iPhone
    @gfreezy 我好像明白了。sign 代表是不是还要考虑接下来的字节。union branch 1 (long, not null)代表类型是 long,因为 branch 0 是 null,所以 long 是 branch 1 。但是我不太确定自己的理解是否正确。明天再仔细看看。
    ky11223344
        3
    ky11223344   4 天前
    sign 就是这个数是正数还是负数,这里是 0 就是指这个数是正数,每个 byte 第一个 bit 是 1 表示还有后续 byte,即这个数还要更多 byte 才能表示完整,0 表示没有后续,是最后一个 byte 了,我记得书上这个位置附近有相关解释是这样讲的,至于 union branch 我也不知道。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1234 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 22:48 · PVG 06:48 · LAX 15:48 · JFK 18:48
    ♥ Do have faith in what you're doing.