如何递归获取Spark DataFrame中的所有列
获取DataFrame所有列(含嵌套Struct列)的方法
嘿,我太懂这种需求了——扁平结构的DataFrame用df.columns超顺手,但碰到嵌套的Struct类型就歇菜,必须把所有层级的列都揪出来才行对吧?我给你整理了PySpark和Pandas两种常用场景的解决方案,亲测好用!
一、PySpark 场景
PySpark里的嵌套Struct得靠递归遍历Schema来拆解,我写了个通用函数,直接拿去用:
from pyspark.sql.types import StructType, StructField def get_all_columns(schema, parent_col=""): columns = [] for field in schema.fields: # 拼接父列和当前列的完整名称 full_col_name = f"{parent_col}.{field.name}" if parent_col else field.name if isinstance(field.dataType, StructType): # 碰到Struct类型就递归挖子字段 columns.extend(get_all_columns(field.dataType, full_col_name)) else: columns.append(full_col_name) return columns # 使用示例 all_nested_columns = get_all_columns(df.schema) print(all_nested_columns)
这个函数会把所有嵌套列都以父列名.子列名的格式返回,比如你有个user_info的Struct列包含name和age,返回的列名就是user_info.name、user_info.age,完全符合PySpark SQL里引用嵌套列的格式。
二、Pandas 场景
Pandas里的嵌套结构分两种情况,我分别给你说解法:
1. 列是MultiIndex的情况
如果你的DataFrame列是多层索引(比如用pd.json_normalize展开JSON后生成的),直接扁平化列名就行:
# 用下划线连接各层级的列名,生成扁平列名 flat_columns = ['_'.join(col).strip() for col in df.columns.values]
2. 列包含嵌套字典/对象的情况
如果列里存的是字典或者自定义对象,先把嵌套结构展开再获取列名:
import pandas as pd from pandas import json_normalize # 假设df里有个'user'列存的是字典格式的嵌套数据 expanded_df = json_normalize(df['user']) # 把原DataFrame的非嵌套列和展开后的列合并 full_df = pd.concat([df.drop('user', axis=1), expanded_df], axis=1) # 获取所有列名 all_columns = full_df.columns.tolist()
实用小技巧
不管用哪种工具,先确认结构准没错:
- PySpark:跑个
df.printSchema(),一眼看清嵌套层级 - Pandas:用
df.info()或者直接df.columns先看表层结构,再针对性处理
内容的提问来源于stack exchange,提问作者addmeaning
相关产品推荐
相关产品推荐

