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

PySpark读取含反斜杠的JSON数据时抛出异常的问题求助

解决PySpark读取含转义JSON字符串的JSON数据问题

你遇到的核心问题很明确:你的JSON里SalesManager字段的值并不是原生的JSON对象,而是被转义后的JSON字符串(相当于把JSON对象先序列化成了字符串,还带了反斜杠做转义处理)。Spark默认会把它识别成普通字符串,但如果你期望它是结构体类型,自然会抛出类型不匹配的异常。之前用的serialization.format和ignore.malformed.json参数解决不了这个问题——前者控制的是Spark内部序列化格式,后者是用来跳过完全损坏的JSON行,和你字段内部的转义字符串问题根本不相关。

下面是具体的解决方案:

步骤1:先以字符串形式读取,再解析转义字段

你可以先把整个JSON读成DataFrame,然后用from_json函数将SalesManager字段的转义字符串解析成结构体。

示例代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import from_json
from pyspark.sql.types import StructType, StructField, StringType

# 初始化SparkSession
spark = SparkSession.builder.appName("ParseEscapedJson").getOrCreate()

# 定义SalesManager字段的目标结构体schema
sales_manager_schema = StructType([
    StructField("Email", StringType(), nullable=True)
])

# 读取原始JSON数据(替换成你的数据源路径)
df = spark.read.json("path/to/your/json/data.json")

# 解析SalesManager的转义字符串为结构体
df_parsed = df.withColumn(
    "SalesManager",
    from_json(df.SalesManager, sales_manager_schema)
)

# 验证解析结果
df_parsed.show(truncate=False)

步骤2:如果一开始想用自定义全局schema读取

如果你一开始就想用自定义schema读取数据,需要先把SalesManager定义为字符串类型,之后再做解析:

# 定义全局schema,先将SalesManager设为StringType
global_schema = StructType([
    StructField("SalesManager", StringType(), nullable=True),
    StructField("colb", StringType(), nullable=True)
])

# 用全局schema读取数据
df = spark.read.schema(global_schema).json("path/to/your/json/data.json")

# 再将SalesManager解析为结构体
df_parsed = df.withColumn(
    "SalesManager",
    from_json(df.SalesManager, sales_manager_schema)
)

这样处理后,SalesManager就会被正确解析成包含Email字段的结构体,不会再抛出类型不匹配的异常了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:12:47