Включение нулевых значений в Spark Join [Scala] - PullRequest
0 голосов
/ 27 января 2020

У меня есть 2 dfs, и я хочу выполнить внутреннее объединение для всех столбцов

val seq1 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df1 = seq1.toDF("id", "name")

val s2 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df2 = s2.toDF("id", "name")

val s3 = Seq((Some("1"), Some("Cat")), (Some("2"), Some("Dog")), (Some("3"), None))
val df3 = s3.toDF("id", "name")

Я хочу, чтобы df1.join(df2, df1.columns, "inner") дал результат df3, но сейчас он исключает ("3", null).

Я видел некоторые ответы, используя <=> или .eqNullSafe, но я не уверен, как применить это к scala коду. Я хочу общее решение, которое может применяться к любому dfs - не зная заранее названия столбцов.

Могу ли я сделать что-то вроде df1.join(df2, df1.columns.map(c => col(c).eqNullSafe()): _*, "inner")? Компилятору это не нравится, но это идея.

1 Ответ

0 голосов
/ 27 января 2020

вы можете создать свое пользовательское условие соединения следующим образом:

val joinCondition = df1.columns.foldLeft(lit(true))((acc,c) => acc and  (df1(c) === df2(c) or df1(c).isNull or df2(c).isNull))

df1.join(df2, joinCondition, "inner")
  .select(df1("*"))

Но так как ваш df2 пуст в вашем тестовом примере, это все равно приведет к пустому результату. Разве вы не можете использовать union или просто left-join?

...