Spark 中的等效枚举 Dataframe/Parquet
Enum equivalent in Spark Dataframe/Parquet
我有一个包含数亿行的 table,我想将其存储在 Spark 的数据框中,并作为 parquet 文件保存到磁盘。
我的 Parquet 文件的大小现在超过 2TB,我想确保我已经优化了它。
这些列中有很大一部分是字符串值,它们可能很长,但通常也只有很少的值。例如,我有一列只有两个不同的值(一个 20 个字符和一个 30 个字符的字符串),而我有另一列的字符串平均长 400 个字符,但所有条目中只有大约 400 个不同的值。
在关系数据库中,我通常会将这些值规范化为带有引用的不同 table,或者至少用某种枚举类型定义我的 table。
我在 DF 或 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")
我有一个包含数亿行的 table,我想将其存储在 Spark 的数据框中,并作为 parquet 文件保存到磁盘。
我的 Parquet 文件的大小现在超过 2TB,我想确保我已经优化了它。
这些列中有很大一部分是字符串值,它们可能很长,但通常也只有很少的值。例如,我有一列只有两个不同的值(一个 20 个字符和一个 30 个字符的字符串),而我有另一列的字符串平均长 400 个字符,但所有条目中只有大约 400 个不同的值。
在关系数据库中,我通常会将这些值规范化为带有引用的不同 table,或者至少用某种枚举类型定义我的 table。
我在 DF 或 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")