使用AWS Glue从S3桶创建Dynamic Frame无返回值,求排查错误
问题分析与解决方法
可能的错误点及对应修复步骤
S3路径配置错误
- 确保
connection_options里的paths是实际的S3路径,格式为s3://你的桶名/根文件夹/,指向包含所有日期子文件夹的根目录即可,Glue会自动递归读取子文件夹内的文件。
- 确保
JSON解析配置缺失
- 你的JSON是多层嵌套结构,若每个文件是单个多行JSON对象(而非每行一个独立JSON),必须在
formatOptions中设置"multiline": true,否则Spark/Glue会将每行视为独立JSON,导致解析失败返回空数据集。 - 可添加
"jsonPath": "$"明确指定读取完整的根节点结构,确保嵌套字段被正确解析。
- 你的JSON是多层嵌套结构,若每个文件是单个多行JSON对象(而非每行一个独立JSON),必须在
代码语法与输出问题
df.count()仅调用计数方法但未打印结果,需改为print(df.count())才能看到实际数据量。- 创建DynamicFrame的代码块存在多余缩进,会引发语法错误,需调整缩进使其与上下文对齐。
- 代码末尾缺少
job.commit(),会导致Glue Job无法正常完成,需补充该语句。
IAM权限不足
- 检查Glue Job关联的IAM角色是否包含以下权限:
s3:GetObject:读取S3桶内的JSON文件s3:ListBucket:遍历S3桶内的子文件夹和文件
- 若权限缺失,需更新IAM角色的权限策略。
- 检查Glue Job关联的IAM角色是否包含以下权限:
修正后的完整代码
import sys from awsglue.transforms import * from awsglue.utils import getResolvedOptions from pyspark.context import SparkContext from awsglue.context import GlueContext from awsglue.job import Job from functools import reduce from awsglue.dynamicframe import DynamicFrame ## @params: [JOB_NAME] args = getResolvedOptions(sys.argv, ['JOB_NAME']) sc = SparkContext() glueContext = GlueContext(sc) spark = glueContext.spark_session job = Job(glueContext) job.init(args['JOB_NAME'], args) df = glueContext.create_dynamic_frame.from_options( connection_type='s3', connection_options={'paths': ['s3://你的桶名/根文件夹/']}, # 替换为实际S3路径 format='json', formatOptions={ "multiline": True, "jsonPath": "$" } ) print('Total Count:') print(df.count()) job.commit()
内容的提问来源于stack exchange,提问作者AIViz
相关产品推荐
相关产品推荐

