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

How to set Parquet file encoding in Spark

Parquet 文档描述了几种不同的编码here

它是否在 read/write 期间在文件内部发生了某种变化,或者我可以设置它? Spark 文档中对此一无所知。仅从 Netflix 团队的 Ryan Blue 的演讲中找到 slides。他将 parquet 配置设置为 sqlContext

sqlContext.setConf("parquet.filter.dictionary.enabled", "true")

看起来这与 Parquet 文件中的普通字典编码无关。

我不确定我是否理解了您查询的全部范围(在这种情况下,请随时澄清)。

您可以使用 "CREATE TABLE src(id int) USING hive OPTIONS(fileFormat 'parquet')" 为配置单元 table 指定存储选项 reference

This one should be easier to follow and more comprehensive

读/写文件: val usersDF = spark.read.load("examples/src/main/resources/users.parquet") usersDF.select("name", "favorite_color").write.save("namesAndFavColors.parquet")

我还假设您可能已经检查过: - sqlContext.parquetFile("File_to_be_read.parquet") - myDataFrame.saveAsParquetFile("file_to_be_saved.parquet")

所以我在 Twitter 工程 blog 上找到了我的问题的答案。

当多个唯一值 < 10^5 时,Parquet 会启用自动字典编码。 Here 是 post 宣布使用自调整字典编码的 Parquet 1.0

UPD:

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

SparkSession.builder
            .appName("name")
            .config("parquet.enable.dictionary","false") //true

关于按列编码,这个错误有一个开放的 issue as improvement in Parquet’s Jira that was created on 14th July, 17. Since dictionary encoding is a default and works only for all table it turns off Delta Encoding(Jira issue)这是唯一适合时间戳等数据的编码,其中几乎每个值都是唯一的。

UPD2

我们如何判断输出文件使用了哪种编码?

  • 我用了镶木地板工具。

    -> brew install parquet-tools(对于 mac)
    -> 镶木地板工具元 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
.

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