복붙노트

[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. ==============================

    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)
    

    예, 참여가 남아 있습니다.

    결론:

  2. from https://stackoverflow.com/questions/46839137/are-hives-implicit-joins-always-inner-joins by cc-by-sa and MIT license