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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:30:02