PySpark join显式指定关联键时公共列重复问题咨询
现象产生原因
两种join写法的底层处理逻辑完全不同:
- 传入
data_1.common_key == data_2.common_key这类布尔表达式作为join条件时,Spark会将其判定为通用连接场景。这类语法本身支持非等值连接、不同名列关联等复杂逻辑,框架不会主动识别关联键是否同名,会原样保留左右两表的全部列,因此两个同名的common_key会同时存在于结果表中。 - 直接传入字符串
'common_key'(或同名字符串列表)作为关联键时,Spark会识别到这是同名键等值连接场景,自动对关联键做去重处理,结果中仅保留一份公共键列,是框架针对该高频场景提供的语法糖。
长语法下避免公共列重复的方案
以下方案全部兼容Spark 3.2.1版本:
方案1:关联后删除右表冗余公共键
join完成后调用drop方法删除右表的公共键即可。注意drop时必须传入带表标识的列对象,不能直接传入列名字符串,否则会同时删除两个同名列:data_want = data_1.join( data_2, data_1.common_key == data_2.common_key, 'left' ).drop(data_2.common_key)方案2:关联后通过select显式指定保留列
如果涉及多个公共键,可以在join完成后通过select明确指定保留范围:仅保留左表全量字段,右表排除所有公共键后再取其余字段:common_keys = ['common_key'] right_cols = [data_2[col] for col in data_2.columns if col not in common_keys] data_want = data_1.join( data_2, data_1.common_key == data_2.common_key, 'left' ).select(data_1['*'], *right_cols)重复列临时引用方式
如果已经生成带重复列的结果表,可先给源表设置别名,通过表别名.列名的格式精准引用对应表的同名字段,不会出现列名歧义:import pyspark.sql.functions as f data_1 = data_1.alias('t1') data_2 = data_2.alias('t2') data_want = data_1.join( data_2, f.col('t1.common_key') == f.col('t2.common_key'), 'left' ) # 引用右表common_key时直接使用f.col('t2.common_key')即可
内容的提问来源于stack exchange,提问作者pinegulf
相关产品推荐
相关产品推荐

