Левое соединение Anti не рассматривает null как повторяющиеся значения в Spark - PullRequest
0 голосов
/ 17 июня 2020

У меня есть две таблицы, и я хочу читать только уникальные записи из исходной таблицы, обе таблицы имеют нулевые значения.

source table:

name| age| degree| dept    
aaa | 20| ece |null
bbb |20 |it |null
ccc |30 |mech| null

target table


name| age |degree |dept
aaa  |20| ece |null
bbb |20 |it| null

soruce_df.join (target_df, seq ("name", "age", "степень"), "leftanti") -> рабочий

soruce_df.join (target_df, seq ("имя", "возраст", "степень", "отдел"), "leftanti") -> Не рабочий

Now i need to pick only 3rd record from source ,

 If i use name ,age ,degree   as my joining key , it's working as expected

But when i include dept it's picking all the records from source table.

Please help me.

1 Ответ

0 голосов
/ 17 июня 2020

Go для теста на равенство, который безопасен для значений NULL.

    soruce_df.join(target_df, soruce_df("name") <=> target_df("name") && soruce_df("age") <=> target_df("age") &&
      soruce_df("degree") <=> target_df("degree") && soruce_df("dept") <=> target_df("dept")
      ,"leftanti").show(false)

    /**
      * +----+---+------+----+
      * |name|age|degree|dept|
      * +----+---+------+----+
      * |ccc |30 |mech  |null|
      * +----+---+------+----+
      */

В python замените <=> на вызов метода eqNullSafe, как показано ниже, пример-

df1.join(df2, df1["value"].eqNullSafe(df2["value"]))
...