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

PySpark读取含嵌套数组-数组-字典结构的JSON文件问题

解决PySpark读取多层嵌套JSON时字段为NULL的问题

当你的JSON是数组嵌套数组再嵌套字典的结构,PySpark自动推断Schema时出现字段(如haha)全为NULL,通常是默认读取逻辑未适配这种深层嵌套结构导致的,以下是具体解决方法:

1. 适配JSON格式,启用多行读取模式

如果data.json是整个文件为一个大数组(而非每行一个JSON对象的JSON Lines格式),PySpark默认按行解析会无法识别完整结构,导致深层字段解析失败。此时必须启用multiLine参数:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("NestedJSONReader").getOrCreate()

# 启用多行模式+全量采样推断Schema
df = spark.read.option("multiLine", "true") \
               .option("samplingRatio", "1.0") \
               .json("data.json")

df.show(truncate=False)
df.printSchema()
  • multiLine=True:告知Spark读取整个文件为单个JSON对象,适配顶层为数组的结构
  • samplingRatio=1.0:让Spark读取全部数据推断Schema(默认采样比例可能不足以覆盖深层嵌套字段)

2. 手动逐层展开嵌套结构(兜底方案)

若自动推断仍有问题,可手动拆解嵌套层级,确保每个层级结构被正确解析:

from pyspark.sql.functions import explode

# 读取顶层数组
df_raw = spark.read.option("multiLine", "true").json("data.json")

# 展开第一层数组为单独行
df_level1 = df_raw.select(explode(df_raw.columns[0]).alias("level1_arr"))

# 展开第二层数组
df_level2 = df_level1.select(explode(df_level1.level1_arr).alias("nested_dict"))

# 提取字典中的所有字段
df_final = df_level2.select("nested_dict.*")

df_final.show(truncate=False)

通过逐层explode展开数组,再提取字典字段,可彻底避免Schema推断的遗漏问题。

3. 排查字段匹配问题

最后确认JSON中的字段名与查询的字段名完全一致(PySpark对大小写敏感),比如JSON中是Haha但你查询haha,也会返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:13:09