복붙노트

[HADOOP] 하이브는에서 지원하지 않습니다. 다음 쿼리는 어떻게 작성합니까?

HADOOP

하이브는에서 지원하지 않습니다. 다음 쿼리는 어떻게 작성합니까?

두 테이블 A와 B 모두에 열 ID가 있습니다. 나는 B에서 존재하지 않는 A에서 ID를 얻고 싶다. 명백한 방법은 다음과 같다.

SELECT id FROM A WHERE id NOT IN (SELECT id FROM B)

아쉽게도 Hive는 in, exists 또는 subquery를 지원하지 않습니다. 거기 조인을 사용하여 위의 달성 방법이 있습니까?

나는 다음과 같은 것을 생각했다.

SELECT A.id FROM A,B WHERE A.id<>B.id

그러나 이것이 A의 전체를 반환하는 것처럼 보입니다. B의 ID는 항상 A의 어떤 ID와도 같지 않기 때문입니다.

해결법

  1. ==============================

    1.Hive에서 LEFT OUTER JOIN을 사용하여 동일한 작업을 수행 할 수 있습니다.

    Hive에서 LEFT OUTER JOIN을 사용하여 동일한 작업을 수행 할 수 있습니다.

    SELECT A.id
    FROM A
    LEFT OUTER JOIN B
    ON (B.id = A.id)
    WHERE B.id IS null
    
  2. ==============================

    2.하이브는 IN, NOT IN, EXIST 및 NOT EXISTS를 0.13부터 지원하는 것으로 보입니다.

    하이브는 IN, NOT IN, EXIST 및 NOT EXISTS를 0.13부터 지원하는 것으로 보입니다.

    select count(*)
    from flight a
    where not exists(select b.tailnum from plane b where b.tailnum = a.tailnum);
    

    EXIST 및 NOT EXISTS의 하위 쿼리에는 상관 관계가있는 조건부가 있어야합니다 (위의 샘플에서 b.tailnum = a.tailnum과 같습니다) 자세한 내용은 Hive Wiki> WHERE 절의 하위 쿼리를 참조하십시오.

  3. ==============================

    3.당신은 IN을 그렇게하기를 원할 것입니다 :

    당신은 IN을 그렇게하기를 원할 것입니다 :

    SELECT id FROM A WHERE id IN (SELECT id FROM B)
    

    하이브는 이것을 왼쪽 SEMI JOIN으로 덮었습니다 :

    SELECT a.key, a.val
    FROM a LEFT SEMI JOIN b on (a.key = b.key)
    
  4. ==============================

    4.spark sql을 사용할 수 있다면 left anti join을 사용할 수 있습니다.

    spark sql을 사용할 수 있다면 left anti join을 사용할 수 있습니다.

    예 : SELECT A.id FR.A.id = b.id의 왼쪽 anti join B

  5. from https://stackoverflow.com/questions/16804433/hive-doesnt-support-in-exists-how-do-i-write-the-following-query by cc-by-sa and MIT license