我在pyspark
中有两个数据框。他们的架构在
df1
DataFrame[customer_id: int, email: string, city: string, state: string, postal_code: string, serial_number: string]
df2
DataFrame[serial_number: string, model_name: string, mac_address: string]
现在,我希望在full outer join
的公共列上使用coalesce
对这两个数据框执行data frames
。
我在下面做过。我得到了预期的结果。
full_df = df1.join(df2, df1.serial_number == df2.serial_number, 'full_outer').select(df1.customer_id, df1.email, df1.city, df1.state, df1.postal_code, f.coalesce(df1.serial_number, df2.serial_number).alias('serial_number'), df2.model_name, df2.mac_address)
现在我想以不同的方式做到这一点。我不想在连接语句中的select附近写入所有列名,而是想在*
上使用data frame
。基本上我想要下面的东西。
full_df = df1.join(df2, df1.serial_number == df2.serial_number, 'full_outer').select('df1.*', f.coalesce(df1.serial_number, df2.serial_number).alias('serial_number1'), df2.model_name, df2.mac_address).drop('serial_number')
我得到了我想要的东西。在pyspark
编辑
这不是https://stackoverflow.com/questions/36132322/join-two-data-frames-select-all-columns-from-one-and-some-columns-from-the-othe?rq=1
的重复我在join语句中使用coalesce
。我想知道是否有一种方法可以排除我使用coalesce
函数的列
答案 0 :(得分:4)
您可以这样做:
(df1
.join(df2, df1.serial_number == df2.serial_number, 'full_outer')
.select(
[df1[c] for c in df1.columns if c != 'serial_number'] +
[f.coalesce(df1.serial_number, df2.serial_number)]
))