我什么时候应该在 parquet 中使用字典编码?

Jas*_*n S 5 parquet apache-arrow

我看到 parquet 支持每列的字典编码,并且GitHub 文档中描述了字典编码:

\n
\n

字典编码(PLAIN_DICTIONARY = 2 和 RLE_DICTIONARY = 8)

\n

字典编码构建给定列中遇到的值的字典。字典将存储在每个列块的字典页中。使用 RLE/Bit-Packing 混合编码将值存储为整数。如果字典变得太大,无论是大小还是不同值的数量,编码将回退到纯编码。首先写入字典页,然后写入列块的数据页。

\n

字典页面格式:字典中的条目 - 按字典顺序 - 使用纯编码。

\n

数据页格式:用于对存储为 1 字节的条目 id 进行编码的位宽度(最大位宽度 = 32),后跟使用上述 RLE/位打包编码的值(具有给定的位宽度)。

\n

Parquet 2.0 规范中不推荐使用 PLAIN_DICTIONARY 枚举值。对于 Parquet 2.0+ 文件,首选在数据页中使用 RLE_DICTIONARY 并在字典页中使用 PLAIN。

\n
\n

好吧......那么我怎么知道何时使用字典编码?

\n

有什么经验法则可以提供帮助吗?例如,如果列中 90% 的值预计位于某个特定集合中,我应该使用它们吗?

\n

我有一个用例,我期望不同的列有三种不同的场景:

\n
    \n
  • 所有值都位于一个非常小的集合 \xe2\x86\x92 内的整数列似乎非常适合字典编码
  • \n
  • 整数列,其中 99% 的值位于非常小的集合内,但 1% 不太可能形成任何聚类 \xe2\x86\x92 不确定
  • \n
  • 字符串列,其中没有值可能相同 \xe2\x86\x92 似乎字典编码是一个坏主意
  • \n
\n

是否有任何文档解释在各种条件下哪种策略是合适的?

\n