Есть ли способ соединить два спарк-фрейма данных с пользовательским соединением для каждой строки - PullRequest
0 голосов
/ 14 марта 2020

У меня есть два фрейма данных df и df2, как показано ниже

+------+---+----+
|  name|age|city|
+------+---+----+
|  John| 25|  LA|
|  Jane| 26|  LA|
|Joseph| 28|  SA|
+------+---+----+

+---+----+------+
|age|city|salary|
+---+----+------+
| 25|  LA| 40000|
| 26|    | 50000|
|   |  SF| 60000|
+---+----+------+

Я хочу, чтобы мой фрейм данных результата был ниже

+------+---+----+------+
|  name|age|city|salary|
+------+---+----+------+
|  John| 25|  LA| 40000|
|  Jane| 26|  LA| 50000|
|Joseph| 28|  SF| 60000|
+------+---+----+------+

В основном здесь мне нужно присоединиться, используя возраст, город в качестве столбцов соединения но если один из столбцов пуст в df2, тогда мне нужно объединиться только с другим ненулевым столбцом. Решение, которое я ищу, должно быть применимо, даже если в объединении имеется около 5 столбцов, только столбец, не равный NULL, должен участвовать в объединении для каждой строки.

Ответы [ 2 ]

1 голос
/ 14 марта 2020
df1.join(df2,df1.col("age")===df2.col("age") || df1.col("city")===df2.col("city")).select(df1.col("name"),df1.col("age"),df1.col("city"),df2.col("salary")).show
+----+---+----+------+
|name|age|city|salary|
+----+---+----+------+
|john| 25|  LA| 40000|
|Jane| 26|  LA| 40000|
|Jane| 26|  LA| 50000|
+----+---+----+------+```
1 голос
/ 14 марта 2020

Вы могли бы дать больше условий, когда присоединитесь к этим фреймам данных и затем выберите, groupBy будет необходимо.

df1.join(df2, 
    ($"age" === $"age2" || $"age2".isNull) &&
    ($"city" === $"city2" || $"city2".isNull), "left")
   .show

Результат будет:

+------+---+----+----+-----+-------+
|  name|age|city|age2|city2|salary2|
+------+---+----+----+-----+-------+
|  John| 25|  LA|  25|   LA|  40000|
|  Jane| 26|  LA|  26| null|  50000|
|Joseph| 28|  SF|null|   SF|  60000|
+------+---+----+----+-----+-------+

Но когда у вас есть больше столбцы или второй кадр данных имеют больше нулевых значений, результат будет более сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...