Spark文档中指出,默认的zstd压缩级别为1。https://spark.apache.org/docs/latest/configuration.html
我在spark-defaults.conf,中将此属性设置为不同的值
以及像一样的代码内部
val conf = new SparkConf(false)
conf.set("spark.io.compression.zstd.level", "22")
val spark = SparkSession.builder.config(conf).getOrCreate()
..
多次读取相同的输入并使用zstd压缩以镶木地板格式保存/写入,并没有改变输出文件的大小。如何在Spark中调整此压缩级别?
参数spark.io.compression.zstd.level
是关于用于压缩中间文件的编解码器——串行RDD、shuffle、广播、检查点。在大多数情况下,唯一重要的是压缩速度,因此默认的1
将是最佳选择(还应该将spark.io.compression.codec
设置为zstd
,以便此参数生效(。
遗憾的是,无法为Spark中spark.sql.parquet.compression.codec
指定的Parquet编解码器指定压缩级别。
从Spark 3.2(带有parquet-mr>=1.12.0
(开始,有parquet.compression.codec.zstd.level
选项,但似乎不起作用:
In [5]: for i in [1, 5, 10]: df.write.option('parquet.compression.codec.zstd.level', i
...: ).parquet(f"test-{i}.parquet", compression='zstd', mode='overwrite')
In [6]: !du -sh test-*.parquet
40M test-10.parquet
40M test-1.parquet
40M test-5.parquet
作为一种变通方法,可以使用arrow
项目中的Parquet实现(直接在C++中,或通过pyarrow/go/等;它允许为每列的编解码器指定compression_level
,以及默认的compression_level
值(来在将数据写入仓库之前重新打包数据。
遗憾的是,arrow-rs
Parquet实现也不允许指定compression_level
。但幸运的是,parquet2
在arrow2
(箭头的转化无锈实现(中使用。
您可以使用以下内容:
df.write
.option("parquet.compression.codec.zstd.level", "22")
.parquet("/your/output/dir")
此jira中的更多详细信息:https://issues.apache.org/jira/browse/SPARK-39743
您可以通过配置parquet.com.pression.codec.zstd.level来更改级别,例如。。。config("parquet.compression.codec.zstd.level","3"(
有关更多属性,请访问org.apache.parket.hadoop.codec.ZstandardCodec.java
正如另一个提到的22似乎有点极端。我很好奇你的用例是什么。