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

使用PySpark处理嵌套JSON(行内嵌套行)及读取多单JSON文件问题

处理PySpark中嵌套数组与结构体的JSON数据

看起来你已经成功读取了目标文件夹的JSON数据,但现在卡在了fields这个嵌套的数组结构体字段处理上对吧?我来给你几种实用的处理方案,你可以根据自己的业务需求来选:

1. 先展开数组元素(Explode the Array)

如果想把fields数组里的每个结构体都拆成单独的行,用explode函数就能快速实现:

from pyspark.sql.functions import explode

# 把fields数组的每个元素拆成独立行,并给结构体起别名
df_exploded = df.select("id", explode("fields").alias("field_detail"))
df_exploded.show(truncate=False)

这一步完成后,原来每个id对应的多个字段项会变成多行数据,方便后续提取结构体里的具体内容。

2. 提取嵌套结构体的字段为单独列

在展开数组之后,就可以把结构体里的field、type、value拆成单独的列了:

from pyspark.sql.functions import col

# 从结构体中提取字段并重新命名
df_flattened = df_exploded.select(
    "id",
    col("field_detail.field").alias("field_name"),
    col("field_detail.type").alias("data_type"),
    col("field_detail.value").alias("field_value")
)
df_flattened.show(truncate=False)

这样你就得到了一张完全扁平化的表,每行对应一个字段的完整信息,还关联着原始的id。

3. 将字段转成宽表(Pivot)

如果你的需求是把每个field作为列名,value作为对应列的值(也就是把长表转成宽表),可以在上面的基础上用pivot实现:

# 按id分组,以field_name作为列名,提取对应的field_value
df_pivoted = df_flattened.groupBy("id").pivot("field_name").agg(first("field_value"))
df_pivoted.show(truncate=False)

这里用了first聚合函数,如果同一个id和field_name下有多个值,你可以换成max、collect_list等函数,根据实际场景调整就行。

额外小技巧:直接处理未展开的数组

要是你不想展开数组,也能直接操作数组里的元素,比如提取第一个元素的字段名:

from pyspark.sql.functions import element_at

df.select("id", element_at("fields", 1).field.alias("first_field_name")).show()

或者用transform函数批量处理数组里的每个元素,生成自定义格式的数组:

from pyspark.sql.functions import transform, lit, concat

df.select(
    "id",
    transform("fields", lambda x: concat(x.field, lit(": "), x.value)).alias("field_value_pairs")
).show(truncate=False)

这样会得到一个字符串数组,每个元素都是字段名: 值的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:47:36