我正在学习apacheavro,我想知道它是如何在内部表示的。如果我要为同一个问题描述apache parquet,我可以说每个parquet文件由行组组成,每个行组包含列块,列块有多个编码不同的页面。最后,所有这些的元数据都存储在文件的页脚上。github页面及其官方apache页面清楚地记录了这种文件表示。
为了找到apacheavro的相同内部表示,我查看了多个页面,比如github页面、apacheavro的主页、hadoop权威指南以及更多在线教程,但我找不到我要找的内容。我知道apacheavro是面向行的文件格式,每个文件都有模式以及文件中的数据。所有这些都很好,但我想知道如何进一步分解内部组织的数据,可能类似于rdbms表的页面。
任何与此相关的提示都将不胜感激。
1条答案
按热度按时间ar7v8xwq1#
这里的文档中指定了avro容器文件格式。如果你喜欢简洁,那么维基百科有一个更简洁的描述:
avro对象容器文件包括:
文件头,后跟
一个或多个文件数据块。
文件头包括:
四个字节,ascii'o'、'b'、'j',后跟avro版本号1(0x01)(二进制值0x4f 0x62 0x6a 0x01)。
文件元数据,包括模式定义。
此文件的16字节随机生成的同步标记。
对于数据块,avro指定了两种序列化编码:二进制和json。大多数应用程序将使用二进制编码,因为它更小更快。对于调试和基于web的应用程序,json编码有时可能是合适的。
您可以根据它们的引用实现来验证这一点,例如在datafilewriter.java中-从main开始
create
方法,然后看append(D datum)
方法。在他们的文档中描述了二进制对象编码。编码数据只是编码对象(或多个对象)的遍历,每个对象和字段都按照文档中的描述进行编码。