You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AWS Glue作业中设置zstd压缩级别?

背景

zstd压缩编解码器有22个压缩级别。我了解到调整压缩级别可在压缩时间和文件大小间取得平衡后,用df.to_parquet验证自有数据,得到了符合预期的实验结果。因此我希望在写入Delta Lake的AWS Glue Spark作业中将zstd压缩级别设置为19。

实验1

我的AWS Glue作业使用Glue 4.0 - Spark 3.3, Scala 2, Python 3版本。

作业代码如下:

import sys
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)

S3bucket_node1 = glueContext.create_dynamic_frame.from_options(
    format_options={},
    connection_type="s3",
    format="parquet",
    connection_options={
        "paths": [
            "s3://my-bucket/data/raw-parquet/motor/"
        ],
        "recurse": True,
    },
    transformation_ctx="S3bucket_node1",
)

additional_options = {
    "path": "s3://my-bucket/data/delta-tables/motor/",
    "mergeSchema": "true",
}
sink_to_delta_lake_node3_df = S3bucket_node1.toDF()
sink_to_delta_lake_node3_df.write.format("delta").options(**additional_options).mode(
    "overwrite"
).save()

job.commit()

我尝试通过配置参数设置zstd压缩级别,指定了以下--conf配置:

--conf spark.sql.parquet.compression.codec=zstd
--conf parquet.compression.codec.zstd.level=19

在Glue作业中,我通过作业详情 -> 高级属性 -> 作业参数添加这些配置:

  • 键:--conf
  • 值:spark.sql.parquet.compression.codec=zstd --conf parquet.compression.codec.zstd.level=19

但对比压缩级别3和19的运行结果,Delta Lake生成的Parquet文件大小完全相同,均为97 MB(97,002,126字节)。

为验证数据本身在不同zstd压缩级别下会产生大小差异,我用本地Python代码测试:

df.to_parquet(
  local_parquet_path,
  engine="pyarrow",
  compression="zstd",
  compression_level=19
)

结果显示级别19的文件大小是级别3的92%,说明数据本身确实能通过调整zstd压缩级别改变文件大小,但Spark中的上述配置并未生效。

如何在AWS Glue作业中正确设置zstd压缩级别?


实验2~4(2023年9月29日)

我尝试了以下多组配置组合:

组合1:

--conf spark.sql.parquet.compression.codec=zstd
--conf parquet.compression.codec.zstd.level=19

组合2:

--conf spark.sql.parquet.compression.codec=zstd
--conf spark.io.compression.codec=zstd
--conf spark.io.compression.zstd.level=19

组合3:

--conf spark.sql.parquet.compression.codec=zstd
--conf parquet.compression.codec.zstd.level=19
--conf spark.io.compression.codec=zstd
--conf spark.io.compression.zstd.level=19

所有组合的结果一致:Delta Lake生成的zstd格式Parquet文件大小,和未设置压缩级别或设置为3时完全相同。


实验5(2023年9月29日)

仅使用以下配置时:

--conf spark.io.compression.codec=zstd
--conf spark.io.compression.zstd.level=19

最终生成的是Snappy格式文件(例如part-00000-1c8c7408-b14f-4ba1-9030-ecc437a2f8d3-c000.snappy.parquet),说明spark.io.compression.codec=zstd配置未生效。


内容的提问来源于stack exchange,提问作者Hongbo Miao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:53:19