问题描述
我有一个 Spark 作业,它通过快速压缩将数据写入镶木地板文件。 parquet 中的一列是重复的 INT64。
当从带有 parquet 1.8.2 的 spark 2.2 升级到带有 parquet 1.10.1 的 spark 3.1.1 时,我看到压缩比严重下降。
例如this file(使用 spark 2.2 保存)我有以下元数据:
creator: parquet-mr version 1.8.2 (build c6522788629e590a53eb79874b95f6c3ff11f16c)
extra: org.apache.spark.sql.parquet.row.Metadata = {"type":"struct","fields":[{"name":"numbers","type":{"type":"array","elementType":"long","containsNull":true},"nullable":true,"Metadata":{}}]}
file schema: spark_schema
--------------------------------------------------------------------------------
numbers: OPTIONAL F:1
.list: REPEATED F:1
..element: OPTIONAL INT64 R:1 D:3
row group 1: RC:186226 TS:163626010 OFFSET:4
--------------------------------------------------------------------------------
numbers:
.list:
..element: INT64 SNAPPY DO:0 FPO:4 SZ:79747617/163626010/2.05 VC:87158527 ENC:RLE,PLAIN_DICTIONARY ST:[min: 4,max: 1967324,num_nulls: 39883]
使用 spark 3.1 读取并再次保存为 parquet,我得到以下元数据,并且 parquet 部分大小从 76MB 增加到 124MB:
creator: parquet-mr version 1.10.1 (build a89df8f9932b6ef6633d06069e50c9b7970bebd1)
extra: org.apache.spark.version = 3.1.1
extra: org.apache.spark.sql.parquet.row.Metadata = {"type":"struct","Metadata":{}}]}
file schema: spark_schema
--------------------------------------------------------------------------------
numbers: OPTIONAL F:1
.list: REPEATED F:1
..element: OPTIONAL INT64 R:1 D:3
row group 1: RC:186226 TS:163655597 OFFSET:4
--------------------------------------------------------------------------------
numbers:
.list:
..element: INT64 SNAPPY DO:0 FPO:4 SZ:129657160/163655597/1.26 VC:87158527 ENC:RLE,num_nulls: 39883]
注意压缩率从 2.05
降低到 1.26
。
尝试寻找在 spark 或 parquet 版本之间发生变化的任何配置。我唯一能找到的是 parquet.writer.max-padding
从 0
更改为 8MB
,但即使将此配置更改回 0
,我也得到相同的结果。
以下是两种设置的 ParquetoutputFormat 配置:
Parquet block size to 134217728
Parquet page size to 1048576
Parquet dictionary page size to 1048576
Dictionary is on
Validation is off
Writer version is: PARQUET_1_0
Maximum row group padding size is 0 bytes
Page size checking is: estimated
Min row count for page size check is: 100
Max row count for page size check is: 10000
如果您有任何指导,我将不胜感激。
谢谢!
更新
用snappy 1.1.2.6(由spark 2.2使用)检查spark 3,压缩比看起来不错。 将进一步研究这个问题,并更新我的发现。
解决方法
如上所述,snappy-java 1.1.2.6 解决了我的问题。 任何高于此的版本都会导致压缩性能下降。还尝试了 purejava 标志,但这会导致读取镶木地板异常。 将为 snappy-java 开票