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

如何用AWS Glue和Spark生成含null值的对象数组JSON

解决AWS Glue+Spark生成JSON对象数组并保留Null值的问题

问题背景

使用AWS Glue 4.0结合Apache Spark构建数据转换管道时,当前JSON输出为每行一个独立对象(JSON Lines格式),但需要将所有对象包裹在一个顶级数组中,同时保留所有含Null值的字段。

当前输出示例:

{
    "identifier": "1015604061WS",
    "values": { ... }
}
{
    "identifier": "1019502238WS",
    "values": { ... }
}

期望输出示例:

[
    {
        "identifier": "1015604061WS",
        "values": { ... }
    },
    {
        "identifier": "1019502238WS",
        "values": { ... }
    }
]

解决方案

Spark默认的JSON输出为每行一个对象,要生成顶级数组格式,需先将所有行聚合为一个数组列,再输出为单一文件,同时确保Null字段不被过滤。

关键修改步骤

  1. 聚合所有行到单一数组:使用collect_list函数将DataFrame的所有行聚合为一个数组列。
  2. 合并分区生成单一文件:使用coalesce(1)将数据合并到一个分区(仅适合数据量不大的场景,大数据量需谨慎)。
  3. 保留Null字段:确保ignoreNullFields=False的配置生效,同时Struct中的Null字段不会被自动移除。

修改后的代码片段

替换原代码中df_transformed.write.json(...)的部分,改为以下代码:

from pyspark.sql.functions import collect_list, struct

# 将所有行聚合为一个顶级数组
df_array = df_transformed.agg(
    collect_list(struct(col("identifier"), col("values"))).alias("data")
)

# 输出为单一JSON文件,保留所有Null字段
output_path = "s3://project_example/export"
df_array.coalesce(1).write.json(output_path, mode='overwrite', ignoreNullFields=False)

额外注意事项

  • 数据量考量:coalesce(1)会将所有数据集中到一个Executor节点,若数据量过大可能导致性能问题或内存溢出。如果是超大规模数据,建议先评估是否真的需要单一JSON数组文件,或采用其他分片处理方式。
  • Null字段保留验证:确保Spark配置spark.sql.jsonGenerator.ignoreNullFields已设置为false,同时Struct中的字段即使值为Null也会被保留(避免使用dropNullFields等会移除Null字段的操作)。
  • 原代码优化:原代码中when(col('inside_length').isNotNull(), col('inside_length'))可简化为直接使用col('inside_length'),因为ignoreNullFields=False会自动保留Null值字段,无需额外判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:47:33