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

