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

如何在PySpark中选择部分字段时保留数据嵌套结构?

在PySpark中保留嵌套结构并筛选部分字段

你需要保留info的嵌套结构,只保留其中的person和address子字段,同时保留id_card,过滤掉info.work以及原有的data_version字段,以下是几种可行的实现方法:

方法1:直接在select中重构嵌套结构体

使用struct函数将需要保留的子字段重新组合成新的info结构,同时选择id_card字段:

from pyspark.sql.functions import struct

df = df.select(
    struct(
        df["info.person"].alias("person"),
        df["info.address"].alias("address")
    ).alias("info"),
    "id_card"
)

方法2:先重构info字段再选择目标列

如果需要更清晰的步骤拆分,可以先用withColumn重构info字段,再筛选最终需要的列:

from pyspark.sql.functions import struct

df = df.withColumn(
    "info",
    struct(
        df["info.person"].alias("person"),
        df["info.address"].alias("address")
    )
).select("info", "id_card")

方法3:动态构造保留字段(适合批量场景)

如果需要灵活调整保留的子字段,可以通过动态生成参数的方式构造结构体:

from pyspark.sql.functions import struct, col

# 定义需要保留的info子字段列表
keep_info_fields = ["person", "address"]
# 动态生成struct的参数
info_struct_args = [col(f"info.{field}").alias(field) for field in keep_info_fields]

df = df.select(struct(*info_struct_args).alias("info"), "id_card")

验证效果

执行上述代码后,通过df.printSchema()可以看到结构如下:

root
 |-- info: struct (nullable = false)
 |    |-- person: struct (nullable = true)
 |    |    |-- name: string (nullable = true)
 |    |    |-- surname: string (nullable = true)
 |    |    |-- age: integer (nullable = true)
 |    |-- address: struct (nullable = true)
 |    |    |-- location: string (nullable = true)
 |    |    |-- street: string (nullable = true)
 |    |    |-- house_number: integer (nullable = true)
 |-- id_card: string (nullable = true)

此时你可以正常执行df.select('info.person.name')或df.select('info.address.street'),但访问info.work.job_title会抛出字段不存在的错误,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:46:14