在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 |
感谢您在解决此问题方面的宝贵帮助。