[HADOOP] 하이브의 암시 적 조인은 항상 내부 조인입니까?
HADOOP하이브의 암시 적 조인은 항상 내부 조인입니까?
Hive에 대한 조인 문서는 암시 적 조인의 사용을 권장합니다.
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'
, 또는 위의 추가 레코드를 반환 할 것입니다?
해결법
-
==============================
1.항상 그런 것은 아닙니다. 귀하의 질문은 동일합니다. 그러나 WHERE t1.id = t2.id 및 t2.id = t3.id가 없으면 CROSS JOIN이됩니다.
항상 그런 것은 아닙니다. 귀하의 질문은 동일합니다. 그러나 WHERE t1.id = t2.id 및 t2.id = t3.id가 없으면 CROSS JOIN이됩니다.
최신 정보:
이것은 흥미로운 질문이며 데모를 추가하기로 결정했습니다. 두 개의 테이블을 만듭니다.
A (c1 int, c2 문자열) 및 B (c1 int, c2 문자열).
데이터로드 :
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)
크로스 조인 확인 (십자가로 변환되지 않은 암시 적 조인) :
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)
내부 조인을 확인하십시오 (암시 적 조인은 INNER로 작동합니다).
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을 null로 추가하여 왼쪽 조인을 수행하십시오. 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)
보시다시피 우리는 내부자 조인을 다시했습니다. 또는 b.c1이 null 인 경우 무시됩니다.
이제 where 절과 on 절없이 조인을 남겼습니다 (CROSS로 변환 됨).
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)
보시다시피 우리는 다시 십자가를지고 있습니다.
ON 절이 아닌 where 절을 사용하여 왼쪽 조인을 시도하십시오 (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이 null 인 경우는 무시됩니다.
on 절로 왼쪽 조인 :
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 (get 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)
INNER가있는 이유는 NULL이 허용되지 않기 때문입니다.
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)
예, 참여가 남아 있습니다.
결론:
from https://stackoverflow.com/questions/46839137/are-hives-implicit-joins-always-inner-joins by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Windows 10에서 Apache Zeppelin을 구성하는 동안 오류가 발생했습니다. (0) | 2019.06.05 |
---|---|
[HADOOP] 이 쿼리에서 파티션 제거가 발생하지 않는 이유는 무엇입니까? (0) | 2019.06.05 |
[HADOOP] Hive 0.13에서 테이블을 업데이트하는 방법은 무엇입니까? (0) | 2019.06.05 |
[HADOOP] Hadoop - 분산 캐시에있는 큰 파일 (0) | 2019.06.05 |
[HADOOP] oozie의 하이브 작업 대기열 (0) | 2019.06.05 |