在PySpark中加入两个具有空值的数据框时出现问题

时间:2018-09-17 06:42:56

标签: python apache-spark pyspark

在PySpark中连接两个具有空值的数据帧时发出。

我们有两个PySpark数据集。

df1:-

-----------------------------------
|ID |Name|DOB                |Ht  |
-----------------------------------
|101|aaa |2000-01-02 00:00:00|155 |

|102|bbb |2000-01-03 00:00:00|null|

|103|ccc |null               |170 |

df2:-

---------------------------------------
|ID |Age|DOB                |Name|Ht  |
---------------------------------------
|101|31 |2000-01-02 00:00:00|aaa |155 |

|102|32 |2000-01-03 00:00:00|bbb |null|

|103|33 |null               |ccc |170 |

情况1: 我们需要使用键“ ID”和“ Ht”将df1和df2完全连接 我们使用的代码如下所示。

在两个数据框中具有相同名称的列在连接之前被重命名。

    df_2  =df2
    rename_vars = ['Name','DOB']
    rename_vars1 = ['Name_1','DOB_1']
    for colname,newcolname in zip(rename_vars,rename_vars1):  
        df_2  =  df_2.withColumnRenamed(colname,newcolname)


    merge2  =  df1.join(df_2, on =['ID','Ht'],  how  = 'full')
    merge2.printSchema()
    merge2.show()

输出如下所示。

merge2:-

-------------------------------------------------------------------
|ID |Ht  |Name|DOB                |Age |DOB_1              |Name_1|
-------------------------------------------------------------------
|101|155 |aaa |2000-01-02 00:00:00|31  |2000-01-02 00:00:00|aaa   |

|102|null|bbb |2000-01-03 00:00:00|null|null               |null  |

|102|null|null|null               |32  |2000-01-03 00:00:00|bbb   |

|103|170 |ccc |null               |33  |null               |ccc   |

我们期望与ID ='102'对应的值仅记录一条。在此,由于'Ht'的值为null,因此PySpark不会将null作为唯一值,并且会将两个记录添加到合并的数据集中。预期结果如下所示。

merge2 :-

-------------------------------------------------------------------
|ID |Ht  |Name|DOB                |Age |DOB_1              |Name_1|
-------------------------------------------------------------------
|101|155 |aaa |2000-01-02 00:00:00|31  |2000-01-02 00:00:00|aaa   |

|102|null|bbb |2000-01-03 00:00:00|32  |2000-01-03 00:00:00|bbb   |

|103|170 |ccc |null               |33  |null               |ccc   |

感谢您在解决此问题方面的宝贵帮助。

0 个答案:

没有答案