2つのテーブルAとBがあり、キーkもBにあるAのサブセットを取得したいと考えていました。
1つのオプションは、結合を使用することです
select A.*
from A
join B on A.k = B.k
もう1つは
select A.*
from A
where exists (select *, B.k from B where A.k = B.k)
Bのフィールドkが一意である場合、それらは同じであると感じます。Sparkの場合、サブクエリによって実際に存在が考慮されますか?
最も簡単で最も真実の方法は、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)
彼らは似ているようですよね?
私は彼らが同じだと感じています
それらは上で証明された通りです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加