Spark Java, кроме метода и левого ланти, возвращающего противоречивые результаты, возможная ошибка? - PullRequest
0 голосов
/ 24 сентября 2018

Кажется, есть ошибка, с которой я столкнулся в API-интерфейсе данных Spark Java.Я использую искру 2.3.1.Я несколько дней чесал голову и не мог понять причину, по которой результат будет отличаться между двумя подходами для фильтрации нежелательных данных, за исключением использования против leftanti.

Кажется, что функция исключений на самом деле является исключением, отличным!Кадр данных, для которого вызывается исключение, удаляет любые дубликаты!

Просто хотел предоставить эту информацию, если кто-то еще столкнется с той же проблемой!Запуск функции исключения приводит к получению уникальных данных в результирующем кадре данных.Чтобы сохранить исходные данные, обязательно используйте leftanti!

1 Ответ

0 голосов
/ 24 сентября 2018

Кажется, что .except() действует как EXCEPT DISTINCT операция с 2.3.0 .Предыдущие документы, в которых упоминается EXCEPT, неверны, поскольку поведение всегда было EXCEPT DISTINCT

Если сравнивать планы leftanti

== Physical Plan ==
*BroadcastHashJoin [value#1], [value#4], LeftAnti, BuildRight
:- LocalTableScan [value#1]
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, string, true]))
   +- LocalTableScan [value#4]

и except():

== Physical Plan ==
*HashAggregate(keys=[value#1], functions=[])
+- Exchange hashpartitioning(value#1, 200)
   +- *HashAggregate(keys=[value#1], functions=[])
      +- *BroadcastHashJoin [coalesce(value#1, )], [coalesce(value#4, )], LeftAnti, BuildRight, (value#1 <=> value#4)
         :- LocalTableScan [value#1]
         +- BroadcastExchange HashedRelationBroadcastMode(List(coalesce(input[0, string, true], )))
            +- LocalTableScan [value#4]

Вы видите, что есть дополнительный шаг HashAggregate, который удаляет дубликаты.

...