2013-11-25 3 views
4

일부 요약 수치를 생성하기 위해 주기적으로 하이브로 데이터를 가져옵니다. 우리는 현재 CSV 파일 형식을 사용하여 다음과 같이 레이아웃은 다음과 같습니다 타임 스탬프 필드별로 분할 된 테이블

operation,item,timestamp,user,marketingkey 

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

가져 오는 파일이 더 많은 일을 보유하고 있으며 분할 된 방식으로 저장하려고합니다.

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

데이터 로딩이 같이 이루어졌다 : 하이브와 함께 할 수있는 방법 나는 다음과 같은 DDL에 따라 테이블을 구축 가지고 있나요

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 

답변

9

당신이 동적 파티션을 찾고있는 것 같아, 그리고 하이브 자세한 in this article 동적 파티션 삽입을 지원합니다.

먼저 파티션이없는 플랫 데이터를 배치 할 임시 테이블을 만들어야합니다. 귀하의 경우에는이 될 것이다 :

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; 

당신이 동적 파티션 삽입을 사용할 수 있습니다. 염두에 두어야 할 몇 가지 다음과 같은 속성을해야한다는 점입니다 : 동적 파티션이 내가 믿는 기본적으로 비활성화되어 있기 때문에

  • hive.exec.dynamic.partitiontrue로 설정해야합니다.
  • hive.exec.dynamic.partition.modenonstrict으로 설정해야합니다. 단일 파티션이 있고 엄격 모드로 인해 하나의 정적 파티션이 필요하기 때문입니다.

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

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 

동적 파티션은 Hive 0.6 이후에만 지원되므로, 이전 버전을 사용하면 아마 작동하지 않을 것입니다.