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

