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

PySpark读取含null Struct的JSON文件字段提取报错求助

解决PySpark读取含null的嵌套JSON字段报错问题

方法1:显式指定Schema(推荐)

Spark自动推断Schema时,若存在address为null的JSON文件,可能会错误地将address字段推断为String类型,而非预期的Struct类型,导致提取嵌套字段时报错。显式定义Schema可以强制指定字段类型,避免自动推断的问题。

代码示例:

from pyspark.sql.types import StructType, StructField, IntegerType, StringType

# 定义JSON的Schema
json_schema = StructType([
    StructField("id", IntegerType(), nullable=True),
    StructField("name", StringType(), nullable=True),
    StructField("address", StructType([
        StructField("street", StringType(), nullable=True),
        StructField("city", StringType(), nullable=True)
    ]), nullable=True)
])

# 读取JSON时指定Schema
sourcejson = spark.read.schema(json_schema).json("path/to/json")

# 提取字段,此时address为null时,street和city会返回null
df = (
    sourcejson.select(
        col('id'),
        col('name'),
        col('address.street').alias('street'),
        col('address.city').alias('city')
    )
)

方法2:动态转换address字段类型

如果无法提前定义Schema,可以通过coalesce结合struct将非Struct类型的address(比如null或错误类型)转换为合法的Struct,再提取嵌套字段。

代码示例:

from pyspark.sql.functions import col, coalesce, struct, lit

sourcejson = spark.read.json("path/to/json")

# 将address转换为Struct,若为null则返回空Struct(字段均为null)
df = (
    sourcejson.withColumn(
        "address",
        coalesce(
            col("address").cast(StructType([
                StructField("street", StringType()),
                StructField("city", StringType())
            ])),
            struct(lit(None).alias("street"), lit(None).alias("city"))
        )
    ).select(
        col('id'),
        col('name'),
        col('address.street').alias('street'),
        col('address.city').alias('city')
    )
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:42:38