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

AWS Glue Spark脚本生成JSON数组时双引号转义问题求助

解决AWS Glue Spark脚本生成JSON数组时的引号转义和格式问题

问题根源

你手动拼接JSON字符串的方式完全绕开了Spark内置的JSON序列化逻辑,导致无法正确处理字段名的引号包裹、数据类型的JSON规范转换,以及特殊字符的转义。手动拼接不仅容易出错,还不符合JSON标准。

正确解决方案

利用Spark的to_json和struct函数自动处理JSON序列化,无需手动拼接字符串:

步骤1:将单条支付记录转换为标准JSON对象

替换手动拼接payment_info的代码,用struct打包字段,再通过to_json生成符合规范的JSON字符串:

from pyspark.sql import functions as fun

# 将字段打包为结构体,再序列化为JSON字符串
payments_df = payments_df.withColumn(
    "payment_info",
    fun.to_json(
        fun.struct(
            # 日期类型转字符串,避免JSON输出时间戳格式
            fun.col("payment_date").cast("string"),
            # 数值类型直接保留,to_json会自动按JSON规范输出
            fun.col("payment_amount"),
            fun.col("payment_type")
        )
    )
)

步骤2:分组聚合生成JSON数组

分组后收集每个组的JSON对象字符串,再拼接为完整的JSON数组:

# 分组收集JSON对象列表
payments_df = payments_df.groupBy("account_id", "batch_date").agg(
    fun.collect_list("payment_info").alias("payment_info_list")
)

# 将列表拼接为JSON数组字符串
payments_df = payments_df.withColumn(
    "packaged_payments_json_array",
    fun.concat(
        fun.lit("["),
        fun.concat_ws(", ", "payment_info_list"),
        fun.lit("]")
    )
)

更简洁的一步到位写法

直接在聚合时将结构体列表序列化为JSON数组,省去中间拼接步骤:

payments_df = payments_df.groupBy("account_id", "batch_date").agg(
    fun.to_json(
        fun.collect_list(
            fun.struct(
                fun.col("payment_date").cast("string"),
                fun.col("payment_amount"),
                fun.col("payment_type")
            )
        )
    ).alias("packaged_payments_json_array")
)

关键说明

  1. 自动处理引号与转义:to_json会自动给JSON字段名和字符串类型的值添加双引号,遇到特殊字符(如引号、换行符)时会自动转义,完全符合JSON规范。
  2. 数据类型适配:数值类型会按JSON数值格式输出(不加引号),日期类型转字符串后会以标准日期格式输出,避免时间戳问题。
  3. CSV输出兼容:CSV输出时,字符串中的双引号会被自动转义为两个双引号(这是CSV的标准规范),下游工具读取CSV时会自动解析为正确的JSON字符串。

正确输出示例

CSV中该列的输出会类似:

"[{""payment_date"":""2022-05-31"",""payment_amount"":0.00,""payment_type"":""""},{""payment_date"":""2022-05-31"",""payment_amount"":28.83,""payment_type"":""INTEREST ON PURCHASE(S)""},...]"

注:CSV中的双引号转义("")是正常现象,下游解析时会还原为单个双引号的JSON字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:27:26