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

AWS Glue使用write_dynamic_frame写avro到S3生成多part文件如何解决

问题原因

AWS Glue底层基于Spark引擎实现分布式计算,你的DataFrame默认被拆分为多个分区分布在不同的计算节点上,写出时每个分区会对应生成一个独立的part分片文件,你现在看到的9个文件就对应DataFrame当前的9个分区。

调整方案

方案1:输出单个合并文件(适合小数据量场景)

如果你的预期是输出1个完整的Avro文件,只需要在将DataFrame转为DynamicFrame之前,先将DataFrame的分区数合并为1即可,推荐使用coalesce方法(减少分区时不会产生shuffle,性能更高)。
修改后的代码如下:

def write_to_s3(data_frame, s3_path, file_name, glue_context):
    connection_options = {'path': f's3://{s3_path}'}
    # 新增:将DataFrame分区数合并为1
    single_part_df = data_frame.coalesce(1)
    glue_context.write_dynamic_frame.from_options(
        frame=DynamicFrame.fromDF(single_part_df, glue_context, file_name),
        connection_type='s3',
        connection_options=connection_options,
        format='avro'
    )

⚠️ 注意:

  • 如果你的数据量很大(超过单节点内存/磁盘承载能力),不建议强行合并为单个文件,会导致任务运行变慢甚至内存溢出报错,分布式多文件存储才是大数据场景下的最佳实践。
  • 如果你后续需要将分区数调整到比现有分区数更多的场景,可以用repartition(N)方法,该方法会触发shuffle操作。

方案2:自定义输出文件名

如果你的预期是修改默认的part文件名称为指定的文件名,Glue原生写出接口不支持直接指定输出文件名(分布式场景下多节点同时写会有文件名冲突问题),可以在写出完成后调用boto3的S3接口,将生成的part文件重命名为你传入的file_name参数值,同时清理生成的_SUCCESS等临时文件即可。

内容的提问来源于stack exchange,提问作者Pritam Bohra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:02