如何在AWS Glue中设置指定压缩值,手动配置压缩等级与分区?
AWS Glue数据压缩、文件大小控制及分区配置说明
功能支持情况总览
- 手动设定压缩等级:原生直接支持
- 控制单压缩文件大小至指定数值(如500MB):可通过配置间接实现,精度可控
- 按压缩值进行数据分区:无原生支持,需自定义逻辑实现
具体配置实现方法
1. 手动设置压缩等级
AWS Glue底层基于Spark引擎,支持所有Spark兼容的压缩格式(ZSTD、gzip、Snappy、LZO等)的等级自定义,压缩等级越高,压缩比越大、写入耗时越高。
Python脚本配置示例如下:
from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) # 假设dyf为你读取源数据得到的DynamicFrame对象 # 写入S3时指定压缩格式与等级 glueContext.write_dynamic_frame.from_options( frame = dyf, connection_type = "s3", connection_options = {"path": "s3://你的存储桶/输出路径/"}, format = "parquet", # 也可替换为csv、json等你需要的格式 format_options = { "compression": "zstd", # 压缩格式可选zstd、gzip、snappy等 "compressionLevel": 3 # 压缩等级,ZSTD可选范围1-22,gzip可选范围1-9 } )
2. 控制单压缩后文件大小为指定值
没有直接设置单压缩文件大小的参数,可通过以下两种方式间接实现,误差可控制在10%以内:
方法一:通过分区数控制
先小批量测试你选用的压缩格式对应你的数据的实际压缩比,再根据总数据量计算所需分区数。
例:你需要单压缩文件为500MB,测试得ZSTD等级3对你的数据压缩比为2.5:1,即1.25GB原始数据压缩后为500MB;若总原始数据为125GB,则需要100个分区,配置如下:
# 重分区为100个分区 dyf_repartitioned = dyf.repartition(100) # 再写入S3即可得到100个左右压缩后接近500MB的文件
方法二:通过单文件最大记录数控制
如果是行存储格式(CSV、JSON等),可提前统计500MB压缩后文件对应的记录条数,写入时指定maxRecordsPerFile参数:
glueContext.write_dynamic_frame.from_options( frame = dyf, connection_type = "s3", connection_options = {"path": "s3://你的存储桶/输出路径/"}, format = "csv", format_options = { "compression": "gzip", "compressionLevel": 5, "maxRecordsPerFile": 2000000 # 按500MB压缩文件对应的记录数调整 } )
3. 按压缩值分区实现方案
Glue无原生按压缩后数值分区的功能,可通过自定义逻辑实现:先对数据做预采样计算每个逻辑分片的压缩后大小,再调整分区规则。常规使用场景下建议先按业务字段(如日期、地域)做分区,再对每个分区内的数据执行上述的单文件大小控制逻辑,即可实现每个业务分区下的文件大小均符合要求。
内容的提问来源于stack exchange,提问作者RJ7
相关产品推荐
相关产品推荐

