복붙노트

[HADOOP] 타임 스탬프 필드로 분할 표

HADOOP

타임 스탬프 필드로 분할 표

일부 요약 수치를 생성하기 위해 우리는 하이브에 주기적으로 데이터를 가져올 수 있습니다. 우리는 현재 CSV 파일 형식을 사용하여 다음과 같이 레이아웃은 다음과 같습니다

operation,item,timestamp,user,marketingkey

현재 우리는 타임 스탬프 필드의 날짜 (YYYY-MM-DD)를 통해 그룹화를 수행하는 몇 가지 질문이.

가져 오는 파일은 때때로 일 이상을 유지하고 나는 분할 방식에 저장하고 싶습니다. 나는 다음과 같은 DDL에 따라 테이블을 구축해야, 하이브로 할 수있는 방법이 있나요 :

CREATE TABLE 
   partitionedTable (name string) 
PARTITIONED BY (time bigint) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

데이터 로딩과 같이 수행되었다 :

LOAD DATA LOCAL INPATH 
   '/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv' 
INTO TABLE partitionedTable PARTITION(time='2013-05-01');

그러나 나는 그 하이브가 수입되고있는 파일 내에서 제공되는 필드를 기준으로 자동 방식으로 파티셔닝을 적용하고 싶습니다. 예를 들면 :

login,1,1370793184,user1,none --> stored to partition 2013-06-09
login,2,1360793184,user1,none --> stored to partition 2013-02-13
login,1,1360571184,user2,none --> stored to partition 2013-02-11
buy,2,1360501184,user2,key1   --> stored to partition 2013-02-10

해결법

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

    1.그것은 당신이 동적 파티션을 찾고있는 것 같아, 그리고 하이브는이 문서에 설명 된대로 동적 파티션 삽입을 지원합니다.

    그것은 당신이 동적 파티션을 찾고있는 것 같아, 그리고 하이브는이 문서에 설명 된대로 동적 파티션 삽입을 지원합니다.

    첫째, 당신은 당신이 전혀 파티션으로 평면 데이터를 저장합니다 임시 테이블을 작성해야합니다. 귀하의 경우에는이 될 것이다 :

    CREATE TABLE 
        flatTable (type string, id int, ts bigint, user string, key string) 
    ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
    

    그런 다음이 디렉토리로 플랫 데이터 파일을로드해야합니다 :

    LOAD DATA LOCAL INPATH
        '/home/spaeth/tmp/hadoop-billing-data/extracted/testData.csv'
    INTO TABLE flatTable;
    

    그 시점에서 당신은 동적 파티션 삽입을 사용할 수 있습니다. 염두에 두어야 할 몇 가지 다음과 같은 속성을해야한다는 점입니다 :

    그래서 다음과 같은 쿼리를 실행할 수 있습니다 :

    SET hive.exec.dynamic.partition=true;
    SET hive.exec.dynamic.partition.mode=nonstrict;
    FROM
        flatTable
    INSERT OVERWRITE TABLE
        partitionedTable
    PARTITION(time)
    SELECT
        user, from_unixtime(ts, 'yyyy-MM-dd') AS time
    

    이 2 개 맵리 듀스 작업을 산란한다, 그리고 마지막에 당신의 라인을 따라 뭔가를 볼 수 :

    Loading data to table default.partitionedtable partition (time=null)
        Loading partition {time=2013-02-10}
        Loading partition {time=2013-02-11}
        Loading partition {time=2013-02-13}
        Loading partition {time=2013-06-09}
    

    그리고 당신의 파티션이 실제로 여기에 있는지 확인합니다 :

    $ hadoop fs -ls /user/hive/warehouse/partitionedTable/
    Found 4 items
    drwxr-xr-x   - username supergroup          0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-10
    drwxr-xr-x   - username supergroup          0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-11
    drwxr-xr-x   - username supergroup          0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-02-13
    drwxr-xr-x   - username supergroup          0 2013-11-25 18:35 /user/hive/warehouse/partitionedTable/time=2013-06-09
    

    그 동적 파티션은 하이브 0.6부터 지원됩니다주의, 그래서 당신은 이전 버전이 있으면이 아마 작동하지 않을하시기 바랍니다.

  2. from https://stackoverflow.com/questions/20193613/table-partitioned-by-timestamp-field by cc-by-sa and MIT license