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

