Оставил Anti Join v / s Кроме Spark? - PullRequest
0 голосов
/ 29 апреля 2020

Есть ли разница между левым анти-объединением и за исключением Spark в моей реализации ниже?

За исключением случаев, когда оба DF имеют 3 столбца.

scala> val someDF5 = Seq(
     |     ("202003101750", "202003101700", 122),
     |     ("202003101800", "202003101700", 12),
     |     ("202003101750", "202003101700", 42),
     |     ("202003101810", "202003101700", 2),
     |       ("202003101810", "22222222", 222)
     |   ).toDF("number", "word", "value")
someDF5: org.apache.spark.sql.DataFrame = [number: string, word: string ... 1 more field]
scala> val someDF = Seq(
     |   ("202003101750", "202003101700",122),
     |   ("202003101800", "202003101700",12),
     |   ("202003101750", "202003101700",42)
     | ).toDF("number", "word","value")
someDF: org.apache.spark.sql.DataFrame = [number: string, word: string ... 1 more field]
scala> someDF5.except(someDF).show()
+------------+------------+-----+                                               
|      number|        word|value|
+------------+------------+-----+
|202003101810|202003101700|    2|
|202003101810|    22222222|  222|
+------------+------------+-----+

Left-Anti при 1 DF имеет 2 столбца, а другой - 3 столбца

scala> val someDF4 = someDF.drop("value")
someDF4: org.apache.spark.sql.DataFrame = [number: string, word: string]
scala> someDF5.join(someDF4, Seq("number","word"), "left_anti").orderBy($"number".desc).show()
+------------+------------+-----+
|      number|        word|value|
+------------+------------+-----+
|202003101810|202003101700|    2|
|202003101810|    22222222|  222|
+------------+------------+-----+

Выходные данные совпадают, и с левым анти-сигналом мне не нужно одинаковое количество столбцов в обеих таблицах. Итак, действительно ли я получаю один и тот же вывод, используя как исключение, так и левое анти-соединение?

1 Ответ

0 голосов
/ 29 апреля 2020

Нет, это не даст вам тот же результат, это зависит от данных в обоих фреймах данных и столбцах, которые вы используете в left_anit объединении.

Чтобы показать это, я изменил ваш пример данных.

except требует, чтобы оба DataFrame имели одинаковое количество столбцов, он будет сравнивать столбец со столбцом в обоих DataFrame.

left_anti Оба DataFrame могут иметь несколько столбцов, кроме соединяющихся столбцов. Он будет сравнивать только соединяющиеся столбцы.

Производительность left_anti быстрее, чем except Взял ваши образцы данных для выполнения

  1. except потребовалось 316 ms для обработки и отображения data.
  2. left_anti потребовалось 60 ms для обработки и отображения данных.
scala> val someDF5 = Seq(
     |     ("202003101750", "202003101700", 122),
     |     ("202003101800", "202003101700", 12),
     |     ("202003101750", "202003101700", 42),
     |     ("202003101810", "202003101700", 2),
     |     ("202003101810", "22222222", 222),
     |     ("302003101810", "33333333", 10)
     |
     | ).toDF("number", "word", "value")
someDF5: org.apache.spark.sql.DataFrame = [number: string, word: string ... 1 more field]

scala> val someDF = Seq(
     |     ("202003101750", "202003101700",122),
     |     ("202003101800", "202003101700",12),
     |     ("202003101750", "202003101700",42),
     |     ("302003101810", "33333333", 500)
     |     ).toDF("number", "word","value")
someDF: org.apache.spark.sql.DataFrame = [number: string, word: string ... 1 more field]

scala> //Using except

scala> spark.time{
     |     someDF5.except(someDF).show()
     | }
+------------+------------+-----+
|      number|        word|value|
+------------+------------+-----+
|302003101810|    33333333|   10|
|202003101810|202003101700|    2|
|202003101810|    22222222|  222|
+------------+------------+-----+

Time taken: 327 ms

scala> //Using left_anti join.

scala> spark.time{
     |     val someDF4 = someDF.drop("value")
     |     someDF5.join(someDF4, Seq("number","word"), "left_anti").orderBy($"number".desc).show()
     | }
+------------+------------+-----+
|      number|        word|value|
+------------+------------+-----+
|202003101810|202003101700|    2|
|202003101810|    22222222|  222|
+------------+------------+-----+

Time taken: 61 ms

// Added all columns in left_anti join, Now it will give same result as except.

scala> spark.time{
     |     someDF5.join(someDF, Seq("number","word","value"), "left_anti").orderBy($"number".desc).show()
     | }
+------------+------------+-----+
|      number|        word|value|
+------------+------------+-----+
|302003101810|    33333333|   10|
|202003101810|202003101700|    2|
|202003101810|    22222222|  222|
+------------+------------+-----+

Time taken: 74 ms
...