提问者:小点点

Apache Avro-内部表示


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

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

任何与此相关的指针将受到高度赞赏。


共1个答案

匿名用户

Avro容器文件格式在这里的留档中指定。如果你喜欢简洁的东西,那么维基百科有一个更简洁的描述:

Avro对象容器文件包括:

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

文件头包括:

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

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

您可以根据它们的引用实现来验证这一点,例如在DataFileWriter.java中-从主create方法开始,然后查看append(D data)方法。

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