如何使用PySpark将指定JSON结构读取为Spark DataFrame?
如何用PySpark读取嵌套JSON为结构化DataFrame
嘿,我来帮你搞定这个问题!你的JSON是典型的嵌套结构——外层套了一个results数组,真正需要的行数据都在数组里面。直接用spark.read.json读取的话,Spark会把整个results当成单个列,而不是自动展开成多行。下面是具体的解决方案:
步骤1:先确认初始读取的数据结构
先执行你原来的读取代码,看看Spark解析后的结构:
df = spark.read.json('simple.json') df.printSchema()
你会看到类似这样的输出:
root |-- results: array (nullable = true) | |-- element: struct (containsNull = true) | | |-- a: long (nullable = true) | | |-- b: long (nullable = true) | | |-- c: string (nullable = true)
没错,results是一个包含结构体的数组,我们需要把它拆分成单独的行。
步骤2:展开数组并提取目标字段
使用PySpark的explode函数就能把数组里的每个元素拆成独立的行,再从结构体里提取你需要的字段。这里有两种简洁的写法:
方法一:分步操作(更直观)
from pyspark.sql.functions import explode # 把results数组展开,每个元素变成一行,给这行数据命名为result exploded_df = df.select(explode(df.results).alias("result")) # 从result结构体里提取a、b、c三个列 final_df = exploded_df.select("result.a", "result.b", "result.c") # 查看最终结果 final_df.show()
方法二:链式调用(更简洁)
如果不想分步写,可以把操作连起来,用result.*直接展开结构体的所有字段:
from pyspark.sql.functions import explode final_df = df.select(explode("results").alias("result")).select("result.*") final_df.show()
最终输出效果
运行完上面的代码,你就能得到期望的结构化DataFrame:
+---+---+----+ | a| b| c| +---+---+----+ | 1| 2|name| | 2| 5| foo| +---+---+----+
内容的提问来源于stack exchange,提问作者Karthik Mannava
相关产品推荐
相关产品推荐

