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

如何递归获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:18:49