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

PySpark读取含嵌套JSON的多文件并去除外层嵌套键

解决PySpark读取嵌套JSON(外层f0_包裹)并展开字段的问题

嘿,我懂你现在的困扰——读取的JSON数据全被外层的f0_结构体给包起来了,想把里面的id、ActionName、Time直接变成DataFrame的顶级列对吧?这在PySpark里其实挺简单的,我给你分步骤讲清楚两种实用的解决办法:

第一步:先读取JSON文件(基础操作)

首先你应该已经用类似这样的代码读取了目标JSON文件(支持多文件路径,比如用通配符*匹配多个文件):

from pyspark.sql import SparkSession

# 初始化SparkSession
spark = SparkSession.builder.appName("UnnestNestedJSON").getOrCreate()

# 读取多个JSON文件
df = spark.read.json("path/to/your/json/files/*")

这时候你用df.printSchema()查看结构,会看到所有目标字段都嵌套在f0_这个结构体里。

方法一:一键提取所有嵌套字段(最便捷)

如果你不需要修改字段名,只想快速把f0_里的所有字段拉平成顶级列,直接用select配合f0_.*语法就可以,这是PySpark处理嵌套结构体的常用技巧:

# 提取f0_下的所有字段作为顶级列
df_flattened = df.select(df["f0_.*"])

执行完这行代码后,df_flattened的列就直接是id、ActionName、Time了,完全去掉了外层的f0_嵌套。

方法二:逐个提取并可自定义列名(灵活可控)

如果需要给某些字段重命名,或者只想提取部分嵌套字段,可以用withColumn逐个提取,最后删掉原来的f0_列:

from pyspark.sql.functions import col

df_flattened = df.withColumn("id", col("f0_.id")) \
                 .withColumn("action_name", col("f0_.ActionName"))  # 这里把ActionName重命名为action_name
                 .withColumn("event_time", col("f0_.Time"))  # 把Time重命名为event_time
                 .drop("f0_")  # 移除外层的f0_列

这种方式适合需要对列名做调整的场景,灵活性更高。

可选:提前指定Schema提升效率(针对大型数据集)

如果你的数据集很大,或者字段类型需要严格控制,可以提前定义Schema再读取文件,避免PySpark自动推断Schema带来的性能损耗:

from pyspark.sql.types import StructType, StructField, StringType, TimestampType

# 定义内层字段的Schema
inner_schema = StructType([
    StructField("id", StringType(), nullable=True),
    StructField("ActionName", StringType(), nullable=True),
    StructField("Time", TimestampType(), nullable=True)
])

# 定义包含外层f0_的完整Schema
full_schema = StructType([
    StructField("f0_", inner_schema, nullable=True)
])

# 使用指定Schema读取文件
df = spark.read.schema(full_schema).json("path/to/your/json/files/*")

读取完成后,再用上面两种方法展开字段即可。

最后可以验证一下处理后的结果:

df_flattened.printSchema()
df_flattened.show(5)

这时候就能看到预期的扁平结构DataFrame了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:27:52