更好的方法来选择所有列并加入pyspark数据框

时间:2018-05-18 18:20:47

标签: apache-spark pyspark

我在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函数的列

1 个答案:

答案 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)]
    ))