pyspark 通过多个列连接两个数据集并标记发生不匹配的列

ycl3bljg  于 2022-12-11  发布在  Spark
关注(0)|答案(1)|浏览(113)

我有两个数据集:

df_1 = 

 my_id      col_1    col_2       value
ABC111       null      289      374578
ABC113        456      279      335368
ADC110        757      289      374568
ABC145        366      299      374578
ACC122       null      289      374220

df_2

 my_id      col_1    col_2       value_new
ABC000       null      289          374578
ABC113        456      279          330008
ADC110        757     null          374568
ABC145        366      299          374578
ACC122       null      289          374229
ACC999       null      289          374229

为了查看df_1或df_2中缺少哪些行,我对所有4列进行了完全联接。这样,我就可以看到哪些行不匹配,以及有多少行不匹配。问题是,我想看到**,因为不匹配发生在哪个列**。
所需输出:

missing_keys_from_df_1 =

     my_id      col_1    col_2       value_new  my_id_check col_1_check col_2_check val_check   
    ABC000       null      289          374578         No          Yes         Yes       Yes
    ABC113        456      279          330008         Yes         Yes         Yes       No
    ADC110        757     null          374568         Yes         Yes         No        Yes
    ABC145        366      299          374578         Yes         Yes         Yes       Yes
    ACC122       null      289          374229         Yes         No          No        No
    ACC999       null      289          374229         No          No          No        No

因此,基本上,我想**复制df_2并添加4个布尔列,以检查该列的值是否在df_1中。**这可能吗?

gmxoilav

gmxoilav1#

如果在ID上联接,则可以这样实现。如果您希望同时检查ID,则我们可能必须联接其他列,这将不会给予预期的结果。

SELECT COALESCE(df_1.my_id,df_2.my_id)
    ,COALESCE(df_1.col_1, df_2.col_1) col_1
    ,COALESCE(df_1.col_2, df_2.col_2) col_2
    ,COALESCE(value,value_new) value
    ,CASE WHEN df_1.col_1 = df_2.col_1 THEN 'YES' ELSE 'NO' END col_1_check
    ,CASE WHEN df_1.col_2 = df_2.col_2 THEN 'YES' ELSE 'NO' END col_2_check
    ,CASE WHEN df_1.value = df_2.value_new THEN 'YES' ELSE 'NO' END value_check
 FROM df_1
 FULL OUTER JOIN df_2 on df_1.my_id = df_2.my_id

相关问题