Parquet 数据页 (Data Pages)
在数据页中,三个部分的信息在页头(page header)之后依次进行编码,且数据页内不允许填充(padding)。这些部分按以下顺序排列:
- 重复级别数据(repetition levels data)
- 定义级别数据(definition levels data)
- 编码后的值(encoded values)
页头中指定的 uncompressed_page_size
(未压缩页面大小)是上述三部分数据的总和。
数据页内容解析
数据页中的编码值(encoded values)是必须的,而定义级别(definition levels)和重复级别(repetition levels)是可选的,这取决于模式(schema)的定义:
- 非嵌套列(non-nested column):如果列路径的长度为 1(即该列不是嵌套结构),则不会对重复级别进行编码,因为其值始终为 1。
- 必需数据(required data):如果数据列是必需的(required),则会跳过定义级别的编码(如果编码,值始终等于最大定义级别)。
例如,对于非嵌套且必需的列,数据页仅包含编码后的值。
相关支持特性
最佳实践
-
优化存储大小
- 如果列是非嵌套的,应避免存储不必要的重复级别数据,以减少存储开销。
- 对于必需列,可以跳过定义级别数据的存储,以节省空间。
-
合理选择编码方式
- 选择合适的编码格式(如 RLE, PLAIN, DICTIONARY)以提高压缩率和查询性能。
- 对于低基数(low cardinality)数据,优先使用字典编码(DICTIONARY)。
-
压缩策略优化
- 根据数据分布选择最佳压缩编解码器。例如:
- Snappy 适用于快速解压缩场景。
- Gzip 提供更高压缩率,适用于存储优化。
- Zstd 兼具高压缩比和解压缩速度,适用于通用场景。
- 根据数据分布选择最佳压缩编解码器。例如:
-
数据页大小控制
- 适当调整
uncompressed_page_size
以平衡查询性能与存储效率,避免过大的数据页影响查询优化。
- 适当调整
通过遵循这些最佳实践,可以有效优化 Parquet 数据页的存储和查询效率,提高整体性能。