【问题标题】:Enum equivalent in Spark Dataframe/ParquetSpark Dataframe/Parquet 中的等效枚举
【发布时间】:2017-11-27 04:21:32
【问题描述】:

我有一个包含数亿行的表,我想将其存储在 Spark 的数据框中,并作为 parquet 文件保存到磁盘。

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

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

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

我在 DF 或 parquet 文件中看不到任何与该模式匹配的内容。列式存储是否有效地处理了这个问题?还是我应该研究一些东西来进一步优化它?

【问题讨论】:

  • 我建议您将这些对象转换为 byte[] 以存储为镶木地板列。在阅读此内容时,您可以再次转换回对象格式。这不是有效的方法吗?字节数组占用的空间比字符串少。

标签: apache-spark parquet


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-03-14
    • 2014-01-17
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 2011-09-23
    相关资源
    最近更新 更多