PySpark DataFrame连接时如何同时返回两个表的同名join键列
DataFrame连接后同时展示两张表同名连接键的解决方案
你遇到的报错是因为使用on=['key']的方式指定连接条件时,Spark会默认将两张表的key列合并为单个逻辑列,后续再分别引用两张表的同名字段时就会触发列名歧义错误。
可以通过以下几种方法实现需求:
- 方法一:手动指定连接条件,提前重命名其中一张表的连接键
提前将其中一张表的key列改名,再基于条件连接,此时两张表的连接键列名不重复,可以直接查询:
# 重命名df2的连接键 df2_rename = df2.withColumnRenamed("key", "key_df2") # 手动指定连接条件完成左连接 df_join = df1.join(df2_rename, df1["key"] == df2_rename["key_df2"], how="left") \ .select(df1["key"].alias("key_df1"), df2_rename["key_df2"])
- 方法二:给表加别名,通过别名直接引用原表的连接键
不需要提前修改表结构,连接时给两张表设置别名,查询时通过别名区分同名字段即可:
df_join = df1.alias("t1").join(df2.alias("t2"), on=["key"], how="left") \ .selectExpr("t1.key AS key_df1", "t2.key AS key_df2")
- 方法三:用
col函数指定表名前缀引用字段
如果是PySpark场景,也可以通过col函数带表名前缀来区分重名列:
from pyspark.sql.functions import col df_join = df1.join(df2, df1.key == df2.key, how="left") \ .select(col("df1.key").alias("key_df1"), col("df2.key").alias("key_df2"))
内容的提问来源于stack exchange,提问作者Simon Breton
相关产品推荐
相关产品推荐

