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

PySpark嵌套JSON转扁平DataFrame:通用Schema实现问询

PySpark 通用处理动态键嵌套JSON转扁平DataFrame

针对你遇到的verifiedManifest包含未知数量动态键的场景,以下是完全通用的实现方案,无需硬编码任何键名:

1. 定义通用Schema

由于verifiedManifest是字符串键 + 含quantity的结构体的Map结构,直接用MapType定义即可适配任意数量的动态键:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType, MapType

# 定义Schema:verifiedManifest为Map类型,键是字符串,值是包含quantity的结构体
schema = StructType([
    StructField("verifiedManifest", MapType(
        StringType(),
        StructType([StructField("quantity", IntegerType())])
    ))
])

如果JSON中还有其他字段,只需在StructType里添加对应的StructField即可,不影响动态键的处理。

2. 读取JSON数据

用定义好的Schema读取JSON文件,确保Spark正确解析嵌套结构:

df = spark.read.schema(schema).json("path/to/your/json/file.json")

3. 扁平化动态键结构

使用explode函数将Map类型的verifiedManifest拆分为多行,再提取quantity值:

from pyspark.sql.functions import explode, col

# 展开Map的键值对,生成两列:键名(verifiedManifest_name)和对应结构体
df_exploded = df.select(explode(col("verifiedManifest")).alias("verifiedManifest_name", "manifest_value"))

# 提取结构体中的quantity字段并重命名
final_df = df_exploded.select(
    col("verifiedManifest_name"),
    col("manifest_value.quantity").alias("verifiedManifest_quantity")
)

4. 查看结果

执行final_df.show()就能得到你期望的扁平结构:

+---------------------+---------------------------+
|verifiedManifest_name|verifiedManifest_quantity|
+---------------------+---------------------------+
|AB1                  |1                          |
|DE5                  |5                          |
|AG1                  |10                         |
|DOL1                 |100                        |
|BG1                  |3                          |
+---------------------+---------------------------+

额外注意事项

  • 如果verifiedManifest可能为空,用explode_outer替代explode,避免丢失空值对应的行
  • 如果quantity是数值类型(如长整型),将Schema中的IntegerType改为LongType即可
  • 若JSON包含其他顶级字段,在select时保留这些字段即可,例如:df.select("other_field", explode(col("verifiedManifest")).alias(...))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:47:21