복붙노트

[HADOOP] HIVE 삽입 분할 된 테이블로 덮어

HADOOP

HIVE 삽입 분할 된 테이블로 덮어

나는 파티션 테이블에 삽입 덮어 쓰기를 실행. 명령 후, 예를 들어 아래의 파티션이 생성됩니다 말한다.         에이 비 씨 디이

지금은 삽입 덮어 쓰기 테이블,하지만 데이터의 완전히 다른 세트로 시간을 다시 실행합니다. 2 삽입 한 후, 아래의 파티션이 생성 얻을, 예를 들어 말.           F, G, H, I, J

설문 번째 인서트의 데이터가 먼저 삽입에 속하는 데이터를 덮어 쓰지. 난 여전히 폴더 2 삽입 후 HDFS에서 A, B, C, D, E를 참조하십시오. 하지만 HIVE를 통해 쿼리 할 때, A, B, C, D 파티션, 전자는 표시되지 않습니다.

이 삽입 덮어 쓰기 테이블의 예상되는 행동인가? 또는 여기 아무것도 실종?

해결법

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

    1.다음은 몇 가지 샘플 스크립트와 그 효과입니다.

    다음은 몇 가지 샘플 스크립트와 그 효과입니다.

    이제 우리는 세 개의 필드, A, B, 그리고 C, 2 개 개의 파티션 필드 YEAR 및 MONTH와 테이블 SOME_TABLE 있다고 가정 해 봅시다. 이제 우리는 테이블에 데이터가 아니라 테이블의 구조를 삭제할 것을 가정 해 보자.

    1. 어떤 파티션 사양하지

    우리가 실행하는 경우

    INSERT OVERWRITE TABLE SOME_TABLE
    PARTITION
    (
         YEAR
        ,MONTH
    )
    SELECT A,B,C,YEAR,MONTH
    FROM SOME_TABLE
    WHERE FALSE
    

    다음 쿼리는 실행하지만 데이터가 유지됩니다.

    2. 부분 파티션 사양

    우리가 실행하는 경우

    INSERT OVERWRITE TABLE SOME_TABLE
    PARTITION
    (
         YEAR=2018
        ,MONTH
    )
    SELECT A,B,C,MONTH
    FROM SOME_TABLE
    WHERE FALSE
    

    다음 같은 상황이 발생합니다 데이터가 유지됩니다.

    3. 전체 파티션 사양

    우리가 실행하는 경우

    INSERT OVERWRITE TABLE SOME_TABLE
    PARTITION
    (
         YEAR=2018
        ,MONTH=11
    )
    SELECT A,B,C
    FROM SOME_TABLE
    WHERE FALSE
    

    단지 다음 데이터가 삭제되고, 단지 특정 연도와 달. 다른 파티션의 데이터는 삭제되지 않습니다.

    어떤 파티션이 삭제되지 않았는지주의 및 INSERT의 덮어 쓰기를 실행하기 전에 존재하는 것을 포함하여 모든 파티션을 반환 SOME_TABLE 쇼 파티션.

    사이드 참고 : 나는 기존의 모든 데이터를 삭제하는 방법이 있는지 알고 호기심하지만 테이블 구조를 유지하는 것입니다. DROP 테이블 구조를 드롭한다. DROP 파티션은 대상 파티션을 삭제 것 ... 표를 ALTER, 그래서 우리는 각 파티션 필드가 소요 값의 어떤 범위를 미리 알고 있어야합니다. 이 예제에서, 우리는 할 수

    ALTER TABLE SOME_TABLE DROP PARTITION(year>=0,month>0) PURGE;
    

    하지만 여전히 너무 복잡 솔루션을 보인다.

  2. ==============================

    2.이상하다. 나는 위의 시나리오를 시도했지만 다른 결과를 참조하십시오. 우선 인서트 A, B, C, D, E의 파티션을 생성하는 덮어 않았다. 쇼 PARTITIONS뿐만 아니라 데이터를 반환 검색어를 선택을 할 수 명령을 통해 그들을 볼 수.

    이상하다. 나는 위의 시나리오를 시도했지만 다른 결과를 참조하십시오. 우선 인서트 A, B, C, D, E의 파티션을 생성하는 덮어 않았다. 쇼 PARTITIONS뿐만 아니라 데이터를 반환 검색어를 선택을 할 수 명령을 통해 그들을 볼 수.

    그럼 난 g, f를 다섯 개의 새로운 paritions을 만들어 또 다른 삽입 덮어 쓰기는 H, I, J,했다. 내가 SHOW 파티션을 할 때 나는에서 J까지의 모든 파티션을 참조하십시오. 또한 데이터는 모든 파티션에 그대로 선택 문을 통해 가져올 수 있어요.

    다음 단계로 내가 기존 파티션에 데이터를로드하는 시도는 말을하고 그 데이터가 파티션에 기존 데이터를 덮어 씁니다 볼 수 있었다. 이것은 예상 된 동작입니다.

    당신이 그것으로 테이블 및로드 데이터를 생성하는 데 사용되는 문장을 공유하십시오.

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

    3.하이브에 덮어으로 삽입하여 기존의 모든 데이터를 삭제하고, (당신이 당신의 테이블을 만들 때) 당신이 이전에 생성 된 파티션에 새로운 데이터를 쓰기보다. 당신은 파티션을 만들 때, 그들은 메타 데이터를 하이브 추가됩니다,하지만 당신은 파티션이나 table.Thus을 떨어질 때까지 그들은 당신이``테이블 overwrite`, 그 파티션은 여전히 ​​새로운 데이터에 적용 할 때, 거기에있어.

    하이브에 덮어으로 삽입하여 기존의 모든 데이터를 삭제하고, (당신이 당신의 테이블을 만들 때) 당신이 이전에 생성 된 파티션에 새로운 데이터를 쓰기보다. 당신은 파티션을 만들 때, 그들은 메타 데이터를 하이브 추가됩니다,하지만 당신은 파티션이나 table.Thus을 떨어질 때까지 그들은 당신이``테이블 overwrite`, 그 파티션은 여전히 ​​새로운 데이터에 적용 할 때, 거기에있어.

  4. from https://stackoverflow.com/questions/40143249/hive-insert-overwrite-into-a-partitioned-table by cc-by-sa and MIT license