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
相关产品推荐
相关产品推荐

