복붙노트

[HADOOP] 하이브 : 주 테이블에서 증분 업데이트를 수행하는 가장 좋은 방법

HADOOP

하이브 : 주 테이블에서 증분 업데이트를 수행하는 가장 좋은 방법

그래서 하이브에 메인 테이블이 있는데, 그것은 내 모든 데이터를 저장할 것입니다.

매달마다 증분 데이터 업데이트를로드 할 수 있어야합니다. 많은 양의 데이터가 10 억 개의 행을 차지합니다. 새로운 데이터가있을 것입니다. 뿐만 아니라 업데이트 된 항목.

이게 가장 좋은 방법은 무엇인가요, 나는 Hive가 최근에 업그레이드 및 업데이트 / 삽입 / 삭제를 지원한다는 것을 알고 있습니다.

내가 생각해 왔던 것은 어떻게 든 업데이트 될 엔트리를 찾고 메인 테이블에서 삭제 한 다음 새로운 증분 업데이트를 삽입하는 것입니다. 그러나 이것을 시도한 후에 인서트는 매우 빠르지 만, 삭제는 매우 느립니다.

다른 방법은 update 문을 사용하여 메인 테이블과 증분 업데이트의 키 값을 일치시키고 필드를 업데이트하는 방법입니다. 나는 아직 이것을 시도하지 않았다. Hive는 각 항목을 1 씩 업데이트해야하므로 느리게 들립니다.

누구나 가장 효율적이고 효과적으로이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 저는 Hive와 데이터베이스 전반에 대해 꽤 새로 왔습니다.

해결법

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

    1.MERGE를 사용하여 ACID 모드에서 업데이트 할 수없는 경우 FULL OUTER JOIN을 사용하여 업데이트 할 수 있습니다. 업데이트 될 모든 항목을 찾으려면 증분 데이터를 이전 데이터와 조인해야합니다.

    MERGE를 사용하여 ACID 모드에서 업데이트 할 수없는 경우 FULL OUTER JOIN을 사용하여 업데이트 할 수 있습니다. 업데이트 될 모든 항목을 찾으려면 증분 데이터를 이전 데이터와 조인해야합니다.

    insert overwrite target_data [partition() if applicable]
    SELECT
      --select new if exists, old if not exists
      case when i.PK is not null then i.PK   else t.PK   end as PK,
      case when i.PK is not null then i.COL1 else t.COL1 end as COL1,
      ... 
      case when i.PK is not null then i.COL_n else t.COL_n end as COL_n
      FROM 
          target_data t --restrict partitions if applicable
          FULL JOIN increment_data i on (t.PK=i.PK); 
    

    target_data에서 겹쳐 쓰고 조인 될 파티션을 제한하여이를 최적화 할 수 있습니다.

    또한 모든 열을 새 데이터로 업데이트하려는 경우이 솔루션을 UNION ALL + row_number ()와 함께 적용 할 수 있습니다. https://stackoverflow.com/a/44755825/2700344

  2. from https://stackoverflow.com/questions/37709411/hive-best-way-to-do-incremetal-updates-on-a-main-table by cc-by-sa and MIT license