跳转至

Parquet 列块(Column Chunks)

列块由一个个连续写入的页面(pages)组成。这些页面共享一个通用的页头(header),读取器可以跳过不感兴趣的页面。页面的数据紧随其头部,并且可以进行压缩和/或编码。压缩和编码方式在页面的元数据(metadata)中指定。

一个列块可能部分或完全采用字典编码(dictionary encoding)。这意味着数据页面中存储的是字典索引,而不是实际的值。实际的值存储在字典页面(dictionary page)中。详情请参考 Parquet 编码(Encodings)。字典页面必须放在列块的最前面,每个列块最多只能包含一个字典页面。

此外,文件可以包含一个可选的列索引(column index),以便读取器可以更高效地跳过不需要的页面。关于列索引的详细信息及其在格式中的作用,请参考 Parquet 页面索引(Page Index


最佳实践

1. 合理使用字典编码

  • 当数据集中有较多重复值时,字典编码可以有效减少存储空间,提高查询效率。
  • 由于字典页面必须放在列块的最前面,尽量避免频繁更改字典内容,否则可能会影响读取效率。

2. 利用页面跳过优化查询

  • 通过构建合适的列索引(column index),可以让查询时快速跳过无关的页面,提高检索性能。
  • 尽量使用分区(partitioning)结合列索引,以减少数据扫描范围。

3. 选择合适的压缩和编码方式

  • 压缩(Compression):根据数据特征选择合适的压缩算法,例如:
    • Snappy:解压缩速度快,适用于查询优化。
    • Gzip:压缩比高,适用于存储优化。
    • Zstd:兼顾高压缩比和解压缩速度。
  • 编码(Encoding):不同的编码方式适用于不同类型的数据:
    • PLAIN:适用于小数据集或不需要编码的数据。
    • RLE(Run Length Encoding):适用于连续重复值的数据。
    • BIT PACKING:适用于整数类型数据,能够高效存储小范围整数。

4. 避免过小的列块

  • 过小的列块可能导致较多的 I/O 操作,影响读取性能。
  • 建议在合理范围内调整列块大小,以减少 I/O 访问次数,提高整体吞吐量。

5. 测试和优化

  • 在不同的查询场景下测试列块大小、压缩方式和编码方式,以找到最佳的存储策略。
  • 使用 Parquet 相关工具(如 parquet-tools)分析数据结构,优化数据组织,提高存储和查询性能。