我什么时候应该在拼花地板上使用字典编码



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

字典编码(PLAIN_DICTIONAY=2和RLE_Dictionary=8(

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

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

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

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

好的。。。。那么我如何知道何时使用字典编码呢?

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

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

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

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

我不知道有任何文档(至少在箭头一侧(建议何时使用或不使用字典编码。这是一个很好的问题,你的直觉是合理的——也许你可以尝试用两种方式写这些类型的数据,并比较文件大小和读/写速度。我很想看看你发现了什么。

最新更新