在Spark Dataframe / Parquet中等效的枚举

时间:2017-06-23 14:31:24

标签: apache-spark parquet

我有一个包含数亿行的表,我希望将它存储在Spark中的数据框中,并作为镶木地板文件保存到磁盘。

我的Parquet文件的大小现在超过2TB,我想确保我对此进行了优化。

这些列中的很大一部分是字符串值,可能很长,但通常也只有很少的值。例如,我有一个只有两个不同值的列(一个20个字符串和一个30个字符的字符串),我有另一个列,其字符串平均长度为400个字符,但在所有条目中只有大约400个不同的值。

在关系数据库中,我通常会将这些值标准化为带引用的不同表,或者至少使用某种枚举类型定义我的表。

我在DF或镶木地板文件中看不到任何与该模式匹配的内容。柱状存储是否有效处理?或者我应该考虑进一步优化这一点?

1 个答案:

答案 0 :(得分:2)

Parquet没有自动生成枚举类型的机制,但您可以使用页面词典。页面字典存储每个镶木地板页面的值列表,以允许行仅引用返回字典而不是重写数据。要在spark中启用镶木地板作家的字典:

spark.conf.set("parquet.dictionary.enabled", "true")
spark.conf.set("parquet.dictionary.page.size", 2 * 1024 * 1024)

请注意,您必须在启用这些选项的情况下编写文件,否则将不会使用该文件。

要使用字典启用存在过滤,您可以启用

spark.conf.set("parquet.filter.dictionary.enabled", "true")

Source: Parquet performance tuning: The missing guide