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

Databricks中使用PySpark JSON Schema解析时_corrupt_record列返回NULL值问题求助

解决PySpark解析嵌套JSON时除首字段外全为NULL的问题

你遇到的核心问题主要来自两个方面:API返回的JSON格式不符合Spark默认解析标准,以及自定义Schema的类型定义错误。下面是针对性的分步解决方案:

问题根源拆解

  1. JSON格式不规范:你提供的示例JSON使用了单引号('),但Spark的JSON解析器仅默认支持双引号(")的标准JSON格式,这会导致嵌套结构无法被正确识别。
  2. Schema类型误用:你给Var4和Var9指定了NullType(),这个类型表示字段只能是null值,而非"允许为null的字符串类型"。当API返回的字段是null但实际应为字符串类型时,Spark会因类型不匹配返回NULL。

具体解决方案

步骤1:标准化API返回的JSON字符串

先把每个单引号格式的JSON转换成标准双引号格式:

import requests
import json

response = requests.get(api_url, headers=api_call_header)
api_json = response.json()  # 假设返回的是JSON字符串列表
# 将单引号JSON转成标准双引号格式
standardized_json = [json.dumps(json.loads(item.replace("'", '"'))) for item in api_json]

步骤2:创建原始字符串列的DataFrame

不要直接用spark.read.json读取并行化后的RDD,先创建一个只包含JSON字符串的基础DataFrame:

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

spark = SparkSession.builder.getOrCreate()
# 构建每行仅包含一个JSON字符串的DataFrame
df_raw = spark.createDataFrame([(s,) for s in standardized_json], ["json_str"])

步骤3:修正自定义Schema

把NullType()替换为允许为null的StringType()(nullable=True为默认属性,可省略):

schema = StructType([
    StructField('Var1', StringType()),
    StructField('Var2', StructType([
        StructField('Var3', StringType()),
        StructField('Var4', StringType()),  # 替换NullType为StringType
        StructField('Var5', StringType()),
        StructField('Var6', StringType()),
        StructField('Var7', StringType()),
        StructField('Var8', StringType())
    ])),
    StructField('Var9', StringType()),  # 替换NullType为StringType
    StructField('Var10', StringType())
])

步骤4:解析JSON并展开嵌套结构

使用from_json解析字符串列,再将结构体字段展开到顶层:

# 解析JSON字符串为结构体类型
df_parsed = df_raw.withColumn("parsed_data", from_json(col("json_str"), schema))
# 展开嵌套结构体的所有字段
df_final = df_parsed.select("parsed_data.*")
display(df_final)

为什么之前的尝试失败?

  • 自定义Schema错误:NullType是特殊类型,仅匹配严格的null值,而API返回的Var4/Var9属于"可为null的字符串",必须用StringType()。
  • multiLine=True误用:该参数用于读取多行JSON文档,你的数据是单行JSON字符串列表,因此不适用。
  • RDD推导Schema失效:原始JSON的单引号格式导致Spark无法正确识别嵌套结构,只能解析表层字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:57:29