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") )
关键说明
- 自动处理引号与转义:
to_json会自动给JSON字段名和字符串类型的值添加双引号,遇到特殊字符(如引号、换行符)时会自动转义,完全符合JSON规范。 - 数据类型适配:数值类型会按JSON数值格式输出(不加引号),日期类型转字符串后会以标准日期格式输出,避免时间戳问题。
- 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
相关产品推荐
相关产品推荐

