我想加入两个DataFrame并在pyspark中填充NaN吗?

时间:2019-04-25 05:34:54

标签: pyspark data-science pyspark-sql

我想以以下方式在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")

但是,不幸的是,这对我没有用。任何帮助或提示将不胜感激。

1 个答案:

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