【问题标题】:Apache Avro - Internal RepresentationApache Avro - 内部表示
【发布时间】:2020-09-27 18:33:15
【问题描述】:

我正在学习 Apache Avro,我想知道它在内部是如何表示的。如果我要为同一个问题描述 Apache Parquet,我可以说每个 Parquet 文件由 row_groups 组成,每个 row_groups 包含列块,而列块具有多个具有不同编码的页面。最后,所有这些元数据都存储在文件页脚中。这个文件表示在 Github page 以及它的官方 Apache page 中有清楚的记录。

为了找到 Apache Avro 的相同内部表示,我查看了多个页面,例如 Github page、Apache Avro 的 home 和 Hadoop 权威书 guide 以及更多在线教程,但我无法找到我想要的我正在寻找。我了解 Apache Avro 是面向行的文件格式,每个文件都具有模式以及文件中的数据。所有这些都很好,但我想知道如何进一步分解数据以进行内部组织,例如 RDBMS 表的页面。

任何与此相关的指针将不胜感激。

【问题讨论】:

    标签: hadoop avro parquet


    【解决方案1】:

    Avro 容器文件格式在其文档 here 中指定。如果你喜欢简洁的东西,那么维基百科有一个更简洁的description

    一个 Avro 对象容器文件包括:

    • 文件头,后跟
    • 一个或多个文件数据块。

    一个文件头包括:

    • 四个字节,ASCII 'O'、'b'、'j',后跟 Avro 版本号 1 (0x01)(二进制值 0x4F 0x62 0x6A 0x01)。
    • 文件元数据,包括架构定义。
    • 为此文件随机生成的 16 字节同步标记。

    对于数据块,Avro 指定了两种序列化编码,二进制和 JSON。大多数应用程序将使用二进制编码,因为它更小更快。对于调试和基于 Web 的应用程序,JSON 编码有时可能是合适的。

    您可以根据他们的参考实现来验证这一点,例如在DataFileWriter.java - 从主要的create 方法开始,然后查看append(D datum) 方法。

    二进制对象编码在他们的文档here 中有描述。编码数据只是对编码对象(或多个对象)的遍历,每个对象和字段都按照文档中的描述进行编码。

    【讨论】:

    • 谢谢@jon-hanson。这对我有帮助。抱歉,我无法在他们的官方网站上找到这些信息。
    • @VenkatesanMuniappan 没问题,这就是 StackOverflow 的用途。
    • 感谢您的理解?
    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多