如何在Spark中设置Parquet文件编码

Art*_*iev 5 scala apache-spark parquet apache-spark-sql

实木复合地板文档描述了几个不同的编码这里

它是在读/写期间以某种方式在文件内部发生变化,还是我可以设置它?Spark文档中没有任何关于它的内容.只有来自Netflix团队的Ryan Blue演讲的幻灯片.他将镶木地板配置设置为sqlContext

sqlContext.setConf("parquet.filter.dictionary.enabled", "true")
Run Code Online (Sandbox Code Playgroud)

看起来它不是关于Parquet文件中的普通字典编码.

Art*_*iev 9

所以我在twitter工程博客上找到了我的问题答案.

当许多唯一值<10 ^ 5时,Parquet启用了自动字典编码. 是一篇帖子,宣布Parquet 1.0具有自我调整字典编码

UPD:

字典编码可以在SparkSession配置中切换:

SparkSession.builder
            .appName("name")
            .config("parquet.enable.dictionary","false") //true
Run Code Online (Sandbox Code Playgroud)

关于按列编码,在7月14日创建的Parquet的Jira中存在一个未解决的问题.由于字典编码是默认的并且仅适用于所有表,因此它关闭了Delta Encoding(此bug的Jira 问题),这是唯一合适的数据编码,如时间戳,几乎每个值都是唯一的.

UPD2

我们如何判断哪个编码用于输出文件?

  • 我使用了镶木地板工具.

    - > brew install parquet-tools(for mac)
    - > parquet-tools meta your_parquet_file .snappy.parquet

输出:

.column_1: BINARY SNAPPY DO:0 FPO:16637 SZ:2912/8114/3.01 VC:26320 ENC:RLE,PLAIN_DICTIONARY,BIT_PACKED
.column_2: BINARY SNAPPY DO:0 FPO:25526 SZ:119245/711487/1.32 VC:26900 ENC:PLAIN,RLE,BIT_PACKED
.
Run Code Online (Sandbox Code Playgroud)

其中PLAIN和PLAIN_DICTIONARY是用于该列的编码