PySpark from_json解析含转义字符JSON返回null的解决方法咨询
解决Spark from_json解析含HTML实体与转义字符的JSON字符串返回Null的问题
你的JSON字符串同时包含HTML实体编码("对应双引号)和转义字符,导致from_json无法正确解析。核心解决思路是先将HTML实体还原为标准JSON格式,再进行解析,以下是具体实现方案:
方案1:正则替换处理HTML实体
直接用regexp_replace将"替换为双引号,再调用from_json解析:
from pyspark.sql import SparkSession from pyspark.sql.functions import col, regexp_replace, from_json from pyspark.sql.types import StructType, StructField, StringType spark = SparkSession.builder.appName("JsonParse").getOrCreate() # 定义JSON结构schema json_schema = StructType([ StructField("key", StringType()), StructField("value", StringType()) ]) # 构造测试DataFrame df = spark.createDataFrame( [ (1, '{"key":"abc","value":"\\"cde\\""}') ], ["id", "text"] ) # 清理HTML实体并解析JSON df = df.withColumn( "cleaned_text", regexp_replace(col("text"), """, '"') ).withColumn( "dictext", from_json(col("cleaned_text"), json_schema) ) display(df)
运行后dictext列会正常解析出嵌套结构,其中value字段的值为"cde"(包含双引号)。
方案2:通用HTML实体解码(支持更多实体)
如果JSON中包含&、<等其他HTML实体,可通过Python的html模块编写UDF做通用解码:
import html from pyspark.sql.functions import udf from pyspark.sql.types import StringType # 定义HTML解码UDF html_decode_udf = udf(lambda s: html.unescape(s), StringType()) # 解码后解析JSON df = df.withColumn( "cleaned_text", html_decode_udf(col("text")) ).withColumn( "dictext", from_json(col("cleaned_text"), json_schema) ) display(df)
验证解析结果
可通过get_json_object快速验证单个字段的解析情况:
from pyspark.sql.functions import get_json_object df.withColumn( "value_field", get_json_object(col("cleaned_text"), "$.value") ).select("id", "value_field").show()
输出示例:
+---+----------+ | id|value_field| +---+----------+ | 1| "cde" | +---+----------+
内容的提问来源于stack exchange,提问作者gorrch
相关产品推荐
相关产品推荐

