2013-11-25 55 views
4

爲了生成一些摘要數字,我們定期將數據導入到Hive。目前,我們正在使用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 

回答

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.partition應該因爲動態分區默認情況下,我認爲禁止設置爲true
  • hive.exec.dynamic.partition.mode應該設置爲nonstrict,因爲您有一個分區,嚴格模式強制您需要一個靜態分區。

所以,你可以運行下面的查詢:

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個MapReduce作業,並在最後,你應該看到沿東西線:

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以來只支持動態分區,所以如果你有一箇舊版本,這可能不會起作用。