복붙노트

[HADOOP] 두 테이블을 비교하고 HIVE와 다른 행을 반환하는 방법

HADOOP

두 테이블을 비교하고 HIVE와 다른 행을 반환하는 방법

약 180 개의 열과 100 개의 레코드가있는 테이블이 있다고 가정하겠습니다. 이 테이블은 임시 테이블에 백업되고 원래 테이블은 제거됩니다. 이 마이그레이션 후 (변경) 동일한 파이프 라인을 생성하는 파이프 라인에서 실행됩니다. 내가 백업 한 테이블을 새로운 하나의 adn 행 (레코드)과 비교하여 3 번째 테이블 (_result 테이블)로 옮길 수있는 차이점을 알려주고 싶습니다.

INSERT OVERWRITE TABLE
  zakj_customers.customers_detail_result
SELECT
  acct_id, IF (a.title != b.title, 1, 0) title, IF (a.fname != b.fname, 1, 0) fname, IF (a.dob != b.dob, 1, 0) dob, IF (a.cr_date != b.cr_date, 1, 0) cr_date
FROM
  zakj_customers.customers_detail a
LEFT OUTER JOIN
  zakj_customers.customers_detail_backup b
ON
  (a.acct_id = b.acct_id)
ORDER BY 
  title DESC,fname DESC,dob DESC,cr_date DESC
HAVING
  title > 0 AND fname > 0 AND dob > 0 AND cr_date > 0
;

그래서이 쿼리는 잘못된 것입니다. 저는 SQL에 그다지 익숙하지 않습니다. 구문 오류가 발생합니다. 따라서이 형식으로 제공되는 티켓과 함께 올바르게 조합 할 수 없습니다.이 형식은 분명히 잘못되었습니다.

누구든지 이것이 가능한 방법을 볼 수 있습니까?

건배

해결법

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

    1.다음 경우에 대신 "사례"를 사용해야합니다.

    다음 경우에 대신 "사례"를 사용해야합니다.

    Case When a.title <> b.title then 1 Else 0 End title
    

    나는 where 조건에 대한 표현을 작성하지는 않을 것입니다.

    INSERT Into
      zakj_customers.customers_detail_result
    SELECT
      acct_id, a.title, a.fname, dob, a.cr_date
    FROM
      zakj_customers.customers_detail a
    LEFT OUTER JOIN
      zakj_customers.customers_detail_backup b
    ON
      (a.acct_id = b.acct_id)
    Where b.acct_id is null or a.title <> b.title or a.fname <> b.fname or a.cr_date <> b.cr_date;
    

    새 레코드를 필터링하려면 acct_id가 null입니다.

    (레코드를 삽입 할 때는 주문이 필요하지 않습니다.)

  2. from https://stackoverflow.com/questions/26379409/how-to-compare-two-tables-and-return-rows-with-difference-with-hive by cc-by-sa and MIT license