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

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

  •  
  •   JasonLaw · 2020-08-01 22:34:01 +08:00 · 1941 次点击
    这是一个创建于 1574 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在“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  
       2020-08-01 22:50:37 +08:00
    应该看下 avro 具体怎么序列化的,感觉是类似 varint 的编码方式
    JasonLaw
        2
    JasonLaw  
    OP
       2020-08-01 22:58:22 +08:00 via iPhone
    @gfreezy 我好像明白了。sign 代表是不是还要考虑接下来的字节。union branch 1 (long, not null)代表类型是 long,因为 branch 0 是 null,所以 long 是 branch 1 。但是我不太确定自己的理解是否正确。明天再仔细看看。
    ky11223344
        3
    ky11223344  
       2020-08-02 00:20:03 +08:00
    sign 就是这个数是正数还是负数,这里是 0 就是指这个数是正数,每个 byte 第一个 bit 是 1 表示还有后续 byte,即这个数还要更多 byte 才能表示完整,0 表示没有后续,是最后一个 byte 了,我记得书上这个位置附近有相关解释是这样讲的,至于 union branch 我也不知道。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2723 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:37 · PVG 13:37 · LAX 21:37 · JFK 00:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.