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

AWS Glue写入S3的Parquet文件数与MySQL记录数一致问题排查

问题分析与解决:Glue任务生成与记录数相同的Parquet文件

原因

这种现象本质是Spark(AWS Glue基于Spark构建)的分区机制导致的:

  • 当读取的数据集极小(仅13条记录)时,Spark的分区数可能等于记录数,每个分区仅包含1条数据
  • 写入Parquet时,每个分区会单独生成一个文件,最终就出现了13个文件对应13条记录的情况
  • 另外,Glue通过Data Catalog读取MySQL时,若未指定JDBC分区参数,默认的分片逻辑可能会将小数据集拆分为多个小分区

解决方法

方法1:合并分区(最直接有效)

在写入前将数据合并到单个分区,这样最终只会生成一个Parquet文件。推荐用coalesce(1)(无需shuffle,性能更优),修改代码如下:

# 新增:合并分区到1个
merged_frame = ChangeSchemaApplyMapping_node1671554868239.toDF().coalesce(1)
dynamic_merged_frame = glueContext.create_dynamic_frame.from_df(merged_frame, glueContext, "merged_frame")

# 修改写入步骤的frame参数为合并后的DynamicFrame
AmazonS3_node1671554880876 = glueContext.write_dynamic_frame.from_options(
    frame=dynamic_merged_frame,
    connection_type="s3",
    format="glueparquet",
    connection_options={
        "path": "s3://onebox-glue-etl-pre/etl-tpv/output/with_partition/",
        "partitionKeys": [],
    },
    format_options={"compression": "gzip"},
    transformation_ctx="AmazonS3_node1671554880876",
)

方法2:调整Glue作业并行度

在Glue作业的运行参数中设置:

  • --num-workers 1:使用1个工作节点
  • --worker-type G.1X:限制单节点的并行度
    不过这种方法对极小数据集的效果不如直接合并分区明显

方法3:优化JDBC读取分区设置

如果通过Data Catalog读取MySQL,可以在表的JDBC连接参数中指定:

numPartitions=1

这样读取MySQL数据时会用单个分区,后续写入自然也会生成单个文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:20:36