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

如何获取带DataFrame别名的PySpark连接后DataFrame列名?

PySpark 获取连接后带别名的列名列表

PySpark并没有提供直接返回带表别名的列名列表的属性(比如df.columns_with_alias),但可以通过解析DataFrame的schema元数据或列对象来实现需求——因为join操作后,列的来源别名信息确实被保存在元数据中。

方法一:解析Schema的元数据

每个字段的metadata里的origin字段存储了对应的表别名,遍历schema即可提取并拼接:

from pyspark.sql import SparkSession

# 初始化SparkSession并构造测试数据
spark = SparkSession.builder.appName("alias_column_demo").getOrCreate()
source_df = spark.createDataFrame([(1, "b1", "c1")], ["A_column", "B_column", "C_column"])
target_df = spark.createDataFrame([(1, "b2", "c2")], ["A_column", "B_column", "C_column"])

# 执行指定的join操作
joined_df = source_df.alias("source").join(target_df.alias("target"), 
                                           (source_df.A_column == target_df.A_column), "outer")

# 提取带别名的列名
alias_columns = []
for field in joined_df.schema.fields:
    origin = field.metadata.get("origin")
    if origin:
        alias_columns.append(f"{origin}.{field.name}")
    else:
        alias_columns.append(field.name)

# 按列名排序,让同名列相邻
sorted_columns = sorted(alias_columns, key=lambda x: x.split(".")[1])
print(sorted_columns)

输出结果:

['source.A_column', 'target.A_column', 'source.B_column', 'target.B_column', 'source.C_column', 'target.C_column']

方法二:通过列对象的内部属性直接获取

可以直接获取DataFrame的列对象列表,通过列对象的内部_jc属性获取带别名的完整名称:

# 直接从列对象提取带别名的名称
alias_columns = [col._jc.toString() for col in joined_df.columns]
# 按列名排序
sorted_columns = sorted(alias_columns, key=lambda x: x.split(".")[1])
print(sorted_columns)

这个方法更简洁,但需注意_jc是PySpark的内部属性,未来版本可能存在变更风险,不过当前主流版本均兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:55:16