跳转至

Parquet 嵌套编码(Nested Encoding)

在对嵌套列(nested columns)进行编码时,Parquet 采用 Dremel 编码,并使用 定义级别(definition levels)重复级别(repetition levels) 进行表示。

  • 定义级别(Definition Levels):用于指定列路径中的可选字段被定义了多少级。
  • 重复级别(Repetition Levels):用于指示列路径中的哪个重复字段导致了值的重复。

通过模式(schema),可以计算出 最大定义级别和最大重复级别(即嵌套的深度)。这决定了存储这些级别所需的最大位数(这些级别会为列中的所有值进行定义)。

级别编码方式(Level Encodings)

Parquet 支持两种级别编码方式: 1. BIT_PACKED(位打包编码) 2. RLE(运行长度编码)

然而,目前 仅使用 RLE,因为它已经取代了 BIT_PACKED。


最佳实践(Best Practices)

  1. 理解定义级别和重复级别的作用

    • 在存储嵌套数据结构时,定义级别用于标记字段是否存在,而重复级别用于指示重复项的位置。因此,解析 Parquet 文件时需要正确处理这两个级别,以便还原数据的层次结构。
  2. 避免过深的嵌套结构

    • 过深的嵌套会导致较高的定义级别和重复级别,增加存储和处理的复杂性。建议在设计数据模式时,尽量保持结构扁平化,以提高查询性能。
  3. RLE(运行长度编码)的优势

    • 由于 Parquet 仅使用 RLE 进行级别编码,确保数据在适当的情况下能够利用 RLE 的高效性。例如,对于稀疏数据或重复值较多的数据,RLE 可以显著减少存储空间。
  4. 使用适当的查询引擎

    • 解析 Parquet 嵌套数据时,使用支持 Dremel 读取 方式的查询引擎(如 Apache Drill、Apache Spark、Presto),以便高效处理嵌套列。
  5. 优化数据写入

    • 在写入 Parquet 文件时,确保按照 列式存储 的最佳实践进行,例如:
      • 适当调整 Row Group 大小,以减少 I/O 操作。
      • 确保 分区(Partitioning) 方式合理,以便提升查询效率。

以上实践可帮助提升 Parquet 文件的存储效率和读取性能,使其在处理嵌套数据时更加高效。