hadoop - into - how to create table in hive



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

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

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

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

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

감사!

트래비스


Answer #1

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

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

Answer #2

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

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

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);

ab 열은 몇 가지 예제 열입니다. dthour 는 프로덕션 테이블에 도달하면 파티션을 분할하려는 값입니다. staging_unpartitionedstaging_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;

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





database-partitioning