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

Glue Job执行成功但未向目标S3桶写入数据求助

问题排查与解决思路

1. 先确认SQL查询是否真的返回数据

  • 检查你写的SQL:SELECT DISTINCT "ID" FROM myDataSource,注意双引号包裹的"ID"在Spark SQL里是区分大小写的。如果你的Catalog表字段实际是小写id,或者字段名不带引号时是不区分大小写的,这会导致匹配不到字段,直接返回空结果。可以改成SELECT DISTINCT ID FROM myDataSource试试,或者先确认表字段的实际大小写。
  • 临时加个数据行数打印,在代码里SparkSQL转换后加一行:
    print(f"转换后数据行数: {ApplyMapping_node2.count()}")
    
    跑Job后去CloudWatch日志里看这个输出,如果是0,那问题肯定出在SQL查询或者数据源本身。

2. 检查S3写入的执行逻辑

  • Glue的动态帧写入是懒执行的,只有触发action操作才会实际写入。虽然job.commit()理论上会触发,但如果动态帧是空的,可能连空文件都不会生成。可以强制触发计算,在写入前加一行:
    ApplyMapping_node2.count()  # 触发action,确保计算执行
    AmazonS3_node166237 = glueContext.write_dynamic_frame.from_options(...)
    
  • 确认S3路径是否正确:s3://target_bucket/results/里的桶名、路径拼写有没有错,别把桶名写错了。

3. 验证IAM角色权限

  • 别忽略权限问题:Glue Job用的IAM角色必须有目标S3桶的s3:PutObject和s3:ListBucket权限。有些情况下权限不足不会直接让Job失败,只会静默不写入数据,去CloudWatch日志里搜关键词AccessDenied看看有没有相关报错。

4. 排查动态帧转换问题

  • 可以给自动生成的sparkSqlQuery函数加个日志,看看SQL查询的DataFrame是不是空的:
    def sparkSqlQuery(glueContext, query, mapping, transformation_ctx) -> DynamicFrame:
        for alias, frame in mapping.items():
            frame.toDF().createOrReplaceTempView(alias)
        result = spark.sql(query)
        print(f"SQL查询返回行数: {result.count()}")  # 新增日志
        return DynamicFrame.fromDF(result, glueContext, transformation_ctx)
    
    如果这里打印的行数是0,就回去检查数据源Catalog表有没有数据,或者SQL语句是否正确。

5. 最简场景测试

  • 先把SQL换成SELECT * FROM myDataSource LIMIT 5,跑一次Job。如果能生成文件,说明原SQL查询确实返回空结果;如果还是没文件,就重点排查S3写入配置和权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:41:03