Удалить дубликаты из Spark SQL, соединяющие два кадра данных - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть два искровых DF, к которым мне нужно присоединиться. Только выбирайте значения из df2, которые присутствуют в df1, не должно быть повторяющихся строк.

Например:

df1:

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927|
| 202003101730|   202003101700|1930860788|
| 202003101730|   202003101600|    101713|
| 202003101720|   202003101700|1261542412|
| 202003101720|   202003101600|   1824155|
| 202003101710|   202003101700| 912601761|
+-------------+---------------+----------+

df2:

+-------------+---------------+
|a            |b              |
+-------------+---------------+
| 202003101800|   202003101700|
| 202003101800|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101750|   202003101700|
| 202003101740|   202003101700|
| 202003101740|   202003101700|
+-------------+---------------+

Я делаю следующее:

df1.join(df2, Seq("a", "b"), "leftouter").where(col("val").isNotNull) Но мой вывод содержит несколько повторяющихся строк.

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927|
| 202003101740|   202003101700|1590554927||
+-------------+---------------+----------+

Я пытаюсь выполнить операцию «кроме как», если val удален из df1. Но except, похоже, не работает. Например, следующая операция - это желаемая операция df1.drop(col("val")).except("df2") Схема выглядит следующим образом для df1:

root
 |-- a: String (nullable = true)
 |-- b: String (nullable = true)
 |-- val: long (nullable = true)

Кроме того, в чем именно разница между лево-внешним соединением и исключением? Ожидаемый результат:

+-------------+---------------+----------+
|a            |b              |val       |
+-------------+---------------+----------+
| 202003101750|   202003101700|1712384842|
| 202003101740|   202003101700|1590554927||
+-------------+---------------+----------+

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Вы можете использовать функцию dropDuplicates(), которая удаляет все дублирующиеся строки:

uniqueDF = df.dropDuplicates()

Или вы можете указать столбцы, которым вы хотите соответствовать:

uniqueDF = df.dropDuplicates("a","b")
0 голосов
/ 28 апреля 2020

LeftOuter объединение получит все строки из левой таблицы и соответствующие строки из правой таблицы.

Except даст строки, которые не существуют во втором кадре данных, по сравнению с первым кадром данных (без дубликатов).

В вашем случае вы можете использовать inner (или) outer объединение с dropDuplicates.

df1.join(df2, Seq("a", "b"), "inner").dropDuplicates().show()
//+------------+------------+----------+
//|           a|           b|       val|
//+------------+------------+----------+
//|202003101740|202003101700|1590554927|
//|202003101750|202003101700|1712384842|
//+------------+------------+----------+

df1.join(df2, Seq("a", "b"), "rightouter").where(col("val").isNotNull).dropDuplicates().show()
//+------------+------------+----------+
//|           a|           b|       val|
//+------------+------------+----------+
//|202003101740|202003101700|1590554927|
//|202003101750|202003101700|1712384842|
//+------------+------------+----------+
...