복붙노트

[HADOOP] 기존 필드에 의한 파티션 하이브 테이블?

HADOOP

기존 필드에 의한 파티션 하이브 테이블?

기존 필드가 삽입 될 때 하이브 테이블을 분할 할 수 있습니까?

날짜 필드와 시간 필드가있는 10GB 파일이 있습니다. 이 파일을 테이블에로드 한 다음 해당 필드를 파티션으로 사용하는 다른 분할 된 테이블에 삽입하여 덮어 쓸 수 있습니까? 다음 작품과 같은 것이겠습니까?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;

감사!

트래비스

해결법

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

    1.나는 지금 막이 질문에 대답하는 것을 시도해 보았고 도움이되었지만 꽤 완전하지는 않았다. 짧은 대답은 예입니다. 질문의 쿼리가 작동하지만 구문이 올바르지 않습니다.

    나는 지금 막이 질문에 대답하는 것을 시도해 보았고 도움이되었지만 꽤 완전하지는 않았다. 짧은 대답은 예입니다. 질문의 쿼리가 작동하지만 구문이 올바르지 않습니다.

    다음 문장을 사용하여 만든 세 개의 테이블이 있다고 가정 해보십시오.

    CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);
    
    CREATE TABLE staging_partitioned (a int, b int) 
        PARTITIONED BY (datestring string, hour int);
    
    CREATE TABLE production_partitioned (a int, b int) 
        PARTITIONED BY (dt string, hour int);
    

    a와 b 열은 몇 가지 예제 열입니다. dt와 hour는 프로덕션 테이블에 도달하면 파티션을 분할하려는 값입니다. staging_unpartitioned 및 staging_partitioned에서 프로덕션으로 스테이징 데이터를 이동하는 과정은 완전히 같습니다.

    INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
        SELECT a, b, datestring, hour FROM staging_unpartitioned;
    
    INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
        SELECT a, b, datestring, hour FROM staging_partitioned;
    

    여기서는 Dynamic Partitioning이라는 프로세스를 사용합니다.이 프로세스는 여기에서 읽을 수 있습니다. 주목할 중요한 점은 어떤 열이 어떤 파티션과 연관되는지가 SELECT 순서에 의해 결정된다는 것입니다. 모든 동적 파티션은 마지막에서 순서대로 선택해야합니다.

    위의 코드를 실행하려고하면 설정 한 속성으로 인해 오류가 발생합니다. 동적 파티셔닝을 사용하지 않도록 설정 한 경우 먼저 작동하지 않습니다.

    set hive.exec.dynamic.partition=true;
    

    그런 다음 동적 파티션보다 최소한 하나의 정적 파티션에서 파티션을 작성하지 않으면 오류가 발생할 수 있습니다. 이 제한은 서브 파티션을 동적 파티션으로 겹쳐 쓰려고 할 때 실수로 루트 파티션을 제거하는 것을 방지합니다. 내 경험에 비추어 볼 때,이 행동은 결코 도움이되지 않았으며 종종 귀찮았지만 마일리지는 다를 수 있습니다. 어쨌든, 그것은 변경하기 쉽습니다 :

    set hive.exec.dynamic.partition.mode=nonstrict;
    

    그리고 그렇게해야합니다.

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

    2.어쩌면 이것은 이미 답변을 받았을 것입니다 ... 그렇습니다, 당신이 진술 한 것과 똑같이 할 수 있습니다. 나는 그것을 여러 번 해왔다. 분명히 새 테이블은 원본 테이블과 비슷하게 정의되어야하지만 파티션 열은없고 파티션 지정이 필요합니다. 또한 원래 표의 열을 명시 적으로 나열해야하는지 또는 별표가 충분한 지 기억할 수 없습니다.

    어쩌면 이것은 이미 답변을 받았을 것입니다 ... 그렇습니다, 당신이 진술 한 것과 똑같이 할 수 있습니다. 나는 그것을 여러 번 해왔다. 분명히 새 테이블은 원본 테이블과 비슷하게 정의되어야하지만 파티션 열은없고 파티션 지정이 필요합니다. 또한 원래 표의 열을 명시 적으로 나열해야하는지 또는 별표가 충분한 지 기억할 수 없습니다.

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

    3.나는 이것에 관해 매우 확신하지 않는다. 그러나 이것과 같은 무엇인가는 작용할지도 모른다.

    나는 이것에 관해 매우 확신하지 않는다. 그러나 이것과 같은 무엇인가는 작용할지도 모른다.

    INSERT OVERWRITE TABLE tealeaf_event
    SELECT col1 as tealeaf_col1, ..., datestring as ds;
    
  4. ==============================

    4.아닙니다. 해당 필드를 삭제하거나 적어도 이름을 변경해야합니다.

    아닙니다. 해당 필드를 삭제하거나 적어도 이름을 변경해야합니다.

  5. from https://stackoverflow.com/questions/6631464/partition-hive-table-by-existing-field by cc-by-sa and MIT license