Нет, это не даст вам тот же результат, это зависит от данных в обоих фреймах данных и столбцах, которые вы используете в left_anit
объединении.
Чтобы показать это, я изменил ваш пример данных.
except
требует, чтобы оба DataFrame имели одинаковое количество столбцов, он будет сравнивать столбец со столбцом в обоих DataFrame.
left_anti
Оба DataFrame могут иметь несколько столбцов, кроме соединяющихся столбцов. Он будет сравнивать только соединяющиеся столбцы.
Производительность left_anti
быстрее, чем except
Взял ваши образцы данных для выполнения
except
потребовалось 316 ms
для обработки и отображения data. 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