如何在 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 是用于该列的编码
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 是用于该列的编码