Apache Avro - 内部表示

Apache Avro - Internal Representation

我正在学习 Apache Avro,我想知道它在内部是如何表示的。如果我要为同一个问题描述 Apache Parquet,我可以说每个 Parquet 文件由 row_groups 组成,每个 row_groups 包含列块,并且列块具有多个具有不同编码的页面。最后,关于所有这些的元数据存储在文件页脚中。此文件表示形式清楚地记录在 Github page as well in its official Apache page.

为了找到 Apache Avro 的相同内部表示,我查看了多个页面,如 Github page, Apache Avro's home and the book Hadoop definitive guide 和更多在线教程,但我找不到我要找的东西。我知道 Apache Avro 是面向行的文件格式,每个文件都有模式以及文件中的数据。所有这些都很好,但我想知道如何为内部组织进一步分解数据,比如 RDBMS 表的页面。

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

Avro 容器文件格式在其文档中指定here. If you're into the whole brevity thing, then Wikipedia has a more pithy description:

An Avro Object Container File consists of:

  • A file header, followed by
  • one or more file data blocks.

A file header consists of:

  • Four bytes, ASCII 'O', 'b', 'j', followed by the Avro version number which is 1 (0x01) (Binary values 0x4F 0x62 0x6A 0x01).
  • File metadata, including the schema definition.
  • The 16-byte, randomly-generated sync marker for this file.

For data blocks Avro specifies two serialization encodings, binary and JSON. Most applications will use the binary encoding, as it is smaller and faster. For debugging and web-based applications, the JSON encoding may sometimes be appropriate.

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

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