PySpark 3.x写JSON时数组列被额外添加双引号如何解决?
Spark 3.x写入JSON时数组列被额外添加双引号问题排查
问题产生原因
- 最核心的原因是对应列的Schema实际为
StringType而非你预期的ArrayType:通常是在数据转换环节,使用to_json等序列化函数处理数组后,没有将结果解析回结构化的数组类型,直接将字符串格式的数组存入了列中。Spark写入JSON时会将字符串值整体加双引号、转义内部的引号,最终呈现为外层多了双引号的异常格式。 - 少数场景下配置异常导致:如果确认列Schema确实是
ArrayType,则可能是开启了非默认的JSON写入配置,比如强制所有值加引号、开启了全量转义规则。
解决方案
方案1:修正列Schema为原生Array类型(90%以上场景适用)
使用from_json函数将存储JSON格式数组的字符串列转换为Spark原生的Array类型后再写入:
Scala版本示例
import org.apache.spark.sql.functions.from_json import org.apache.spark.sql.types.{ArrayType, StringType} // 替换array_col为你的异常列名,数组元素类型根据实际场景调整,此处以StringType为例 val correctedDf = df.withColumn("array_col", from_json($"array_col", ArrayType(StringType))) correctedDf.write.json("Documents/abc")
PySpark版本示例
from pyspark.sql.functions import from_json from pyspark.sql.types import ArrayType, StringType # 替换array_col为你的异常列名,数组元素类型根据实际场景调整 corrected_df = df.withColumn("array_col", from_json("array_col", ArrayType(StringType()))) corrected_df.write.json("Documents/abc")
方案2:调整JSON写入配置(确认列Schema为ArrayType时适用)
如果确认列类型正确,写入时添加配置关闭不必要的引号转义即可:
df.write .option("escapeQuotes", "false") .option("quoteAll", "false") .json("Documents/abc")
PySpark使用方式一致,在write方法后追加对应option配置即可。
内容的提问来源于stack exchange,提问作者Hafiz Muhammad Shafiq
相关产品推荐
相关产品推荐

