我什么时候应该在镶木地板中使用字典编码? 字典编码PLAIN_DICTIONARY = 2和RLE_DICTIONARY = 8

问题描述

我看到镶木地板支持按列的字典编码,并且字典编码为described in the GitHub documentation

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

字典编码可构建给定列中遇到的值的字典。字典将按列块存储在字典页面中。值使用RLE /位打包混合编码存储为整数。如果字典变得太大,无论是在大小上还是在不同值的数量上,编码都会退回到普通编码。首先写入字典页面,然后再写入列块的数据页面

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

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

在Parquet 2.0规范中不推荐使用PLAIN_DICTIONARY枚举值。对于Parquet 2.0+文件,最好在数据页面中使用RLE_DICTIONARY,在词典页面中使用PLAIN。

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

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

我有一个用例,我希望在不同的列中使用三种不同的方案:

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

是否有文档说明在各种情况下哪种策略合适?

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...