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

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格式

你忽略的关键点

  1. Spark/Glue的默认JSON输出行为:
    Spark(以及基于Spark的AWS Glue)默认的JSON写入器会生成JSON Lines格式,这是为了适配分布式处理场景:

    • 每个数据分区可以独立写入文件,无需汇总所有数据到一个节点,避免内存溢出
    • 读取时可以并行处理每行数据,提升效率
  2. 如何输出标准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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:23:20