我想以以下方式在pyspark中加入两个数据框 df1看起来像:
+-----------+-------------------+-----------------+
| id| date_start_id| date_end_id|
+-----------+-------------------+-----------------+
| 1| 2019-01-29| 2019-02-09|
| 2| 2019-01-29| 2019-02-09|
| 3| 2019-01-29| 2019-02-09|
| 4| 2019-01-29| 2019-02-09|
| 5| 2019-01-29| 2019-02-09|
| 6| 2019-01-29| 2019-02-09|
| 7| 2019-01-29| 2019-02-09|
| 8| 2019-01-29| 2019-02-09|
| 9| 2019-01-29| 2019-02-09|
| 10| 2019-01-29| 2019-02-09|
+-----------+-------------------+-----------------+
df2看起来像:
+-----------+-------------------+-----------------+-----------+
| id| date_start_id| date_end_id| response|
+-----------+-------------------+-----------------+-----------+
| 2| 2019-01-29| 2019-02-09| 1|
| 3| 2019-01-29| 2019-02-09| 1|
| 5| 2019-01-29| 2019-02-09| 1|
| 7| 2019-01-29| 2019-02-09| 1|
| 8| 2019-01-29| 2019-02-09| 1|
+-----------+-------------------+-----------------+-----------+
我想以这样的方式加入两个数据框,使其看起来像这样:
+-----------+-------------------+-----------------+-----------+
| id| date_start_id| date_end_id| response|
+-----------+-------------------+-----------------+-----------+
| 1| 2019-01-29| 2019-02-09| null|
| 2| 2019-01-29| 2019-02-09| 1|
| 3| 2019-01-29| 2019-02-09| 1|
| 4| 2019-01-29| 2019-02-09| null|
| 5| 2019-01-29| 2019-02-09| 1|
| 6| 2019-01-29| 2019-02-09| null|
| 7| 2019-01-29| 2019-02-09| 1|
| 8| 2019-01-29| 2019-02-09| 1|
| 9| 2019-01-29| 2019-02-09| null|
| 10| 2019-01-29| 2019-02-09| null|
+-----------+-------------------+-----------------+-----------+
我做了什么:
df = df1.join(df2, ["id","date_start_id","date_end_id"], "left")
但是,不幸的是,这对我没有用。任何帮助或提示将不胜感激。
答案 0 :(得分:0)
#Pyspark 取 NaN 作为值,所以在 join 后插入 NaN。我更多地使用 SQL 和 spark,因为它很快。
def dropColumn_sql(df,col_names,spark):
col_names = [item for item in df.columns if item not in col_names]
df = df.selectExpr(col_names)
return df
def join_df_with_NaN(df1, df2, cond, how):
df = df1.join(df2, cond, how=how)
for col in df.columns:
df = df.selectExpr("*", f""" case when {col} == null then cast('nan' as float) else {col} end as {col+'_temp'}""")
li = []
li.append(col)
df = dropColumn_sql(df, li, spark).withColumnRenamed(col+'_temp', col )
return df