2012-04-23 69 views
2

我想用Hadoop上現有文件的分區創建表。我需要分區的日期值在文件中可用,但日期值列的位置不是最後一個。它在中間。我怎樣才能創建相同的表?Hive Table分區,中間有列

下面是示例:

1 John 2012-01-10 Miller 
2 Austin 2012-02-22 Powers 

回答

7

讓我們舉個例子:你想有一個分區蜂巢表有三列(id INT, fname STRING, dt STRING, lname STRING)其中idfnamelname是存儲整數ID列,串名字和字符串姓氏,dt是包含日期爲yyyy-MM-dd格式的字符串類型的分區列。要創建一個表,這樣你會發出這樣的命令:

CREATE EXTERNAL TABLE my_table (id INT, fname STRING, lname STRING) 
PARTITIONED BY (dt STRING) 
LOCATION '/usr/hive/warehouse/my_table'; 

當您將數據插入該表(通過INSERT重寫命令,說了),去檢查HDFS位置(在/ usr /蜂巢/倉儲/ MY_TABLE ),你會發現數據存儲在目錄中;每個分區一個目錄。該目錄的名稱可能類似於dt = 2012-01-01dt = 2012-02-22。在這些目錄中,將以您選擇要存儲的任何格式顯示您的實際數據。分區列爲而不是與此數據一起存儲;它是一個虛擬列,從您的數據存在的分區目錄中解密。

現在讓我們來看看您的問題。由於分區列是虛擬列,因此無法將分區Hive表放在數據頂部(不管您的待分區列是存在於文件中間還是末尾)。您需要在HDFS中存在適當的目錄結構才能進行分區工作。你會想創建一個沒有分區的臨時表。

CREATE EXTERNAL TABLE my_table_staging (id INT, fname STRING, dt STRING, lname STRING) 
LOCATION '/usr/hive/warehouse/my_table_staging'; 

然後使用此臨時表作爲源來使用動態分區填充分區表。您可以使用命令類似下面這個:

INSERT OVERWRITE TABLE my_table PARTITION (dt) 
SELECT id, fname, lname, dt FROM my_table_staging; 

這個命令會從你的臨時表中讀取數據,並將其插入到分區表,建立在HDFS爲你適當的目錄結構。

參考文獻: - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL - https://cwiki.apache.org/Hive/dynamicpartitions.html