2017-10-19 2 views
1

ハイブのためjoin documentationはすなわち、加入暗黙のハイブの暗黙的な結合は常に内部結合ですか?

SELECT * 
FROM table1 t1, table2 t2, table3 t3 
WHERE t1.id = t2.id AND t2.id = t3.id AND t1.zipcode = '02535'; 

の使用を奨励

SELECT t1.*, t2.*, t3.* 
FROM table1 t1 
INNER JOIN table2 t2 ON 
    t1.id = t2.id 
INNER JOIN table3 t3 ON 
    t2.id = t3.id 
WHERE t1.zipcode = '02535' 

、または上記リターン追加のレコードがするとこの等価ですか?

答えて

2

必ずしもそうではありません。あなたの質問は同等です。しかし、WHERE t1.id = t2.id AND t2.id = t3.idがなければ、それはCROSS JOINになります。

更新:

これは興味深い質問だと私はいくつかのデモを追加することにしました。 2つのテーブルを作成しましょう:

A(c1 int, c2 string)およびB(c1 int, c2 string)です。

負荷データ:

insert into table A 
select 1, 'row one' union all 
select 2, 'row two'; 

insert into table B 
select 1, 'row one' union all 
select 3, 'row three'; 

チェックデータ:

hive> select * from A; 
OK 
1  row one 
2  row two 
Time taken: 1.29 seconds, Fetched: 2 row(s) 
hive> select * from B; 
OK 
1  row one 
3  row three 
Time taken: 0.091 seconds, Fetched: 2 row(s) 

チェッククロス(暗黙が交差するように形質転換whereことなく結合)に参加:

hive> select a.c1, a.c2, b.c1, b.c2 from a,b; 
Warning: Map Join MAPJOIN[14][bigTable=a] in task 'Stage-3:MAPRED' is a cross product 
Warning: Map Join MAPJOIN[22][bigTable=b] in task 'Stage-4:MAPRED' is a cross product 
Warning: Shuffle Join JOIN[4][tables = [a, b]] in Stage 'Stage-1:MAPRED' is a cross product 

OK 
1  row one 1  row one 
2  row two 1  row one 
1  row one 3  row three 
2  row two 3  row three 
Time taken: 54.804 seconds, Fetched: 4 row(s) 
内部結合10

チェック(暗黙のインナーとしてwhere作品で参加):

hive> select a.c1, a.c2, b.c1, b.c2 from a,b where (a.c1=b.c1) OR (b.c1 is null); 
OK 
1  row one 1  row one 
Time taken: 57.317 seconds, Fetched: 1 row(s) 

することができますように:

hive> select a.c1, a.c2, b.c1, b.c2 from a,b where a.c1=b.c1; 
OK 
1  row one 1  row one 
Time taken: 38.413 seconds, Fetched: 1 row(s) 

どこにOR b.c1 is nullを追加することにより、参加左を実行するようにしてください私たちは再び内部の結合を参照してください。 or b.c1 is nullは(CROSSに変換)whereON句を使用せずに今すぐleft join

を無視されます。

select a.c1, a.c2, b.c1, b.c2 from a left join b; 
OK 
1  row one 1  row one 
1  row one 3  row three 
2  row two 1  row one 
2  row two 3  row three 
Time taken: 37.104 seconds, Fetched: 4 row(s) 

あなたは私たちが再び交差だ見ることができるように。

where句とONなし(INNERとして働く)と結合左試してみてください:

select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1; 
OK 
1  row one 1  row one 
Time taken: 40.617 seconds, Fetched: 1 row(s) 

私たちは、INNERがwhere句でとON +なしで参加左を試してみてください

に参加しましたnullを許可してください:

select a.c1, a.c2, b.c1, b.c2 from a left join b where a.c1=b.c1 or b.c1 is null; 
OK 
1  row one 1  row one 
Time taken: 53.873 seconds, Fetched: 1 row(s) 

もう一度INNERを取得しました。またはb.c1 is nullは無視されます。

on節のあるJOIN:

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1; 
OK 
1  row one 1  row one 
2  row two NULL NULL 
Time taken: 48.626 seconds, Fetched: 2 row(s) 

はい、それは真左で参加します。

on + where(INNERを得た)と結合:

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1; 
OK 
1  row one 1  row one 
Time taken: 49.54 seconds, Fetched: 1 row(s) 

WHEREはNULLSを許可していないので、我々はINNERました。

左はNULLを許可ところ+と結合:

hive> select a.c1, a.c2, b.c1, b.c2 from a left join b on a.c1=b.c1 where a.c1=b.c1 or b.c1 is null; 
OK 
1  row one 1  row one 
2  row two NULL NULL 
Time taken: 55.951 seconds, Fetched: 2 row(s) 

はい、参加残っています。

結論: 句がなければ

  1. 暗黙は中わた(有する)またはクロスのような作品に参加します。
  2. WHERE句でNULLが許可されていない場合、ON結合なしでWHEREを使用しない場合、左結合はCROSSとして機能し、WHERE句ではNULLを使用できない場合は テーブル用に テーブルを使用できます。
  3. これは自己説明的なものであり、どのような動作が期待されるのかが分かりやすいため、ANSI構文を使用する方が効果的です。 INNERまたはCROSSとして機能する暗黙的な結合または左結合は、理解するのが難しく、エラーが発生しやすくなります。
+0

さらに複雑なクエリを取得すると、ついにこれに戻りました。非常にクールな動作の文書化。 –

+0

これらの複雑なデモは、インナージョインとレフトジョインの作成方法を知っているほど明確です。本当にありがとう! – Xiao

関連する問題