AWS Glue写入DynamicFrame生成非标准JSON的技术咨询
AWS Glue写入S3的JSON格式问题解答
输出格式说明
你看到的是**JSON Lines(又称NDJSON,换行分隔JSON)**格式,它是一种每行一个独立JSON对象的格式,而非传统的单JSON数组格式。
该输出是否仅能被Spark解析?
不是。JSON Lines是一种通用的结构化数据格式,很多工具和库都支持解析:
- Python:
pandas.read_json(..., lines=True)、jsonlines库 - Java/Scala:Jackson、Gson等库支持按行读取解析
- 大数据工具:Flink、AWS Athena、Redshift Spectrum都能直接处理这种格式
- 日志分析工具:ELK Stack、Splunk等也支持JSON Lines格式
你忽略的关键点
Spark/Glue的默认JSON输出行为:
Spark(以及基于Spark的AWS Glue)默认的JSON写入器会生成JSON Lines格式,这是为了适配分布式处理场景:- 每个数据分区可以独立写入文件,无需汇总所有数据到一个节点,避免内存溢出
- 读取时可以并行处理每行数据,提升效率
如何输出标准JSON数组:
如果必须输出包含所有对象的标准JSON数组,仅适合小数据量场景(大数据量会导致Driver节点内存溢出),可以通过以下方式实现:spark = SparkSession.builder.getOrCreate() glue_context = GlueContext(spark) df = glue_context.createDataFrame( [ {'name': 'Aaron', 'age': 25, 'function': 'Engineering'}, {'name': 'Baron', 'age': 35, 'function': 'Product'}, {'name': 'Caron', 'age': 45, 'function': 'Marketing'}, {'name': 'Daron', 'age': 55, 'function': 'Sales'} ] ) # 将每行转为JSON字符串并收集到Driver节点 json_strings = df.toJSON().collect() # 拼接成JSON数组格式 json_array_str = f"[{','.join(json_strings)}]" # 创建单条记录的DataFrame并写入S3(用text格式避免额外处理) result_df = glue_context.createDataFrame([(json_array_str,)], schema="json_str string") glue_context.write_dynamic_frame.from_options( frame=DynamicFrame.fromDF(result_df, glue_context, "result_dyf"), connection_type='s3', connection_options={'path': 's3://awsglue/test_write_json_array'}, format='text' )注意:大数据量场景下不推荐这种方式,建议优先使用JSON Lines格式,它更适合分布式存储和处理。
内容的提问来源于stack exchange,提问作者Jimothy
相关产品推荐
相关产品推荐

