2012-01-27 63 views
12

我想創建一個Hive表格,其中輸入文本文件遍歷到hdfs中的多個子目錄中。所以,比如我有HDFS:Hive:使用多個文件夾創建表格

/testdata/user/Jan/part-0001 
    /testdata/user/Feb/part-0001 
    /testdata/user/Mar/part-0001 
and so on... 

如果我想創建一個蜂巢表的用戶,但有它能夠遍歷用戶的子目錄,可以在做什麼?我嘗試過這樣的事情,但不行;

CREATE EXTERNAL TABLE users (id int, name string) 
STORED AS TEXTFILE LOCATION '/testdata/user/*' 

我認爲添加通配符會工作,但不會。當我嘗試不使用通配符仍然不起作用。但是,如果我將這些文件複製到用戶的根目錄中,那麼它就可以工作。 Hive是否無法遍歷子目錄並獲取這些文件?

回答

5

蜂巢使用了子目錄作爲數據的分區,所以乾脆:

CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) 
STORED AS TEXTFILE LOCATION '/testdata/user/' 

這應該爲你做它。

+0

這沒有奏效。其實,我應該提到我現在正在運行CDH3u1。 – user706794 2012-02-01 23:08:07

+2

定義「沒有工作」。我還應該提到,您需要將您的目錄名稱更改爲month = Jan等... – 2012-02-01 23:11:02

0
CREATE EXTERNAL TABLE user (id int, name string); 
LOAD DATA INPATH "/testdata/user/*/*" INTO TABLE users; 
+0

這沒有奏效。其實,我現在應該在CDH3u1上提及。 – user706794 2012-02-01 23:07:44

+0

沒有爲我工作在CDH5.7 – voldy 2017-06-03 00:35:23

17

您可以創建一個外部表,然後將子文件夾添加爲分區。

CREATE EXTERNAL TABLE test (id BIGINT) PARTITIONED BY (yymmdd STRING); 
ALTER TABLE test ADD PARTITION (yymmdd = '20120921') LOCATION 'loc1'; 
ALTER TABLE test ADD PARTITION (yymmdd = '20120922') LOCATION 'loc2'; 
+0

這是一個很棒的迴應!是的,每當有新的數據目錄時(每天一次),你都有必要更新表格的麻煩。但完美無瑕。 – 2014-05-21 02:47:10

+0

這也是關於Hive如何存儲數據的一件很酷的事情。通過這種方式存儲數據,並將其表示爲分區,分區數據成爲虛擬列。這意味着當您以某種方式將查詢結果限制爲日期子集時(在這種情況下),Hive只需在幾個位置搜索,而不是掃描整個數據集以獲得答案。 – agentv 2015-03-02 16:14:49

+0

這應該被選爲接受的答案 - 它完美地回答了這個問題。你也幫助我,所以謝謝你的回答! – 2015-11-30 10:22:22

5

我最終使用了像下面這樣的shell腳本,用於其中子目錄不是先驗已知的用例。

#!/bin/bash 
hive -e "CREATE EXTERNAL TABLE users (id int, name string) PARTITIONED BY (month string) STORED AS TEXTFILE LOCATION '/testdata/user/'; " 

hscript="" 

for part in `hadoop fs -ls /testdata/user/ | grep -v -P "^Found"|grep -o -P "[a-zA-Z]{3}$"`; 
do 

echo $part 
tmp="ALTER TABLE users ADD PARTITION(month='$part');" 
hscript=$hscript$tmp 
done; 

hive -e "$hscript" 
相關問題