Есть ли разница между объединением таблиц и существует при фильтрации таблицы? - PullRequest
0 голосов
/ 05 марта 2019

У меня есть две таблицы A и B, и я хотел получить подмножество A, ключ k которого также находится в B.

Один из вариантов - использовать join

select A.*
from A
join B on A.k = B.k

Другойis

select A.*
from A
where exists (select *, B.k from B where A.k = B.k)

Если поле k в B уникально, я чувствую, что они одинаковы.Для искры, действительно ли существует вопрос, рассматриваемый подзапросом?

1 Ответ

0 голосов
/ 05 марта 2019

Самый простой и самый правдивый способ - explain выполнить оба запроса и сравнить их физические планы.

scala> println(spark.version)
2.4.0

scala> sql("select A.* from A join B on A.k = B.k").explain
== Physical Plan ==
*(2) Project [k#10L]
+- *(2) BroadcastHashJoin [k#10L], [k#6L], Inner, BuildRight
   :- *(2) Project [id#8L AS k#10L]
   :  +- *(2) Range (0, 10, step=1, splits=8)
   +- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
      +- *(1) Project [id#4L AS k#6L]
         +- *(1) Range (0, 10, step=1, splits=8)

scala> sql("""select * from a where exists (select *, B.k from B where A.k = B.k)""").explain
== Physical Plan ==
*(2) Project [id#8L AS k#10L]
+- *(2) BroadcastHashJoin [id#8L], [k#6L], LeftSemi, BuildRight
   :- *(2) Range (0, 10, step=1, splits=8)
   +- BroadcastExchange HashedRelationBroadcastMode(List(input[0, bigint, false]))
      +- *(1) Project [id#4L AS k#6L, id#4L AS k#6L]
         +- *(1) Range (0, 10, step=1, splits=8)

Они кажутся одинаковыми, не так ли?

Я чувствую, что они одинаковы

Они такие же, как доказано выше.

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