2015-02-07 70 views
3

我希望能夠將多個HDFS文件附加到一個Hive表,同時將HDFS文件留在其原始目錄中。這些文件被創建位於不同的目錄中。如何將一個Hive表指向多個外部文件?

LOAD DATA INPATH將HDFS文件移至配置單元倉庫目錄。

據我所知,外部表必須指向一個文件,或者指向一個目錄,其中可以放置多個具有相同模式的文件。但是,我的文件不會位於單個目錄下。

是否有可能指向一個單一的蜂房表提供給多個外部文件在不同的目錄,或以其他方式多個文件複製到一個單一的蜂房表,而將文件從原來的HDFS位置移動?

擴展的解決方案斷普拉迪普的回答的:

例如,我的文件是這樣的:

/root_directory/<job_id>/input/<dt> 

假裝每個模式是(FOO STRING,酒吧STRING,JOB_ID STRING,DT STRING)

我首先創建一個外部表。但是,請注意我的DDL不包含在初始位置,它不包括JOB_ID和DT字段:

CREATE EXTERNAL TABLE hivetest (
foo STRING, 
bar STRING 
) PARTITIONED BY (job_id STRING, dt STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
; 

比方說,我有兩個文件,我想插入位於:

/root_directory/b1/input/2014-01-01 
/root_directory/b2/input/2014-01-02 
如果有人碰巧需要使用了Talend的執行此

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b1', dt='2014-01-01') 
LOCATION '/root_directory/b1/input/2014-01-01'; 

ALTER TABLE hivetest 
ADD PARTITION(job_id = 'b2', dt='2014-01-02') 
LOCATION '/root_directory/b2/input/2014-01-02'; 

,他們可以使用tHiveLoad組件,如:

我可以在這兩個外部文件加載到同一蜂巢表像這樣所以[編輯:這不起作用;下面檢查】:

Matthew Moisen Hive Talend Insert

了Talend產生用於此使用tHiveLoad的代碼實際上是LOAD DATA INPATH ...,這將刪除文件關閉在HDFS其原始位置。

你將不得不做早期的ALTER TABLE語法在tHiveLoad代替。

回答

6

簡短的回答是肯定的。 Hive外部表可以指向多個文件/目錄。長的答案將取決於您的數據的目錄結構。執行此操作的典型方法是創建一個分區表,其中分區列映射到目錄路徑的某個部分。

E.g.我們有一個用例,外部表指向HDFS上的數千個目錄。我們的路徑符合這種模式/prod/${customer-id}/${date}/。在每個這些目錄中,我們都有大約100個文件。在將其映射到Hive表中時,我們創建了兩個分區列customer_id和date。因此,每天,我們能夠將數據加載到蜂巢,通過做

ALTER TABLE x ADD PARTITION (customer_id = "blah", dt = "blah_date") LOCATION '/prod/blah/blah_date'; 
+2

+1。要進一步構建此答案,爲動態添加到分區外部表的每個新分區指定的位置實際上可以是包含數據文件的文件夾的任意路徑 - 它不必是最初定義的位置的子目錄作爲外部表的「根」。 – rchang 2015-02-07 14:22:34

+0

嘿Pradeep。你介意檢查我的編輯,以確認我的表格定義的DDL是否正確?值得注意的是,不包括intitial DDL中的位置。問候 – 2015-02-10 00:45:28

+0

這看起來很好......我不確定表的DDL是否需要LOCATION(我認爲它)。如果是這樣,你總是可以把它放到一個虛擬的位置。 – 2015-02-10 05:56:30

0

試試這個:

LOAD DATA LOCAL INPATH '/path/local/file_1' INTO TABLE tablename; 

LOAD DATA LOCAL INPATH '/path/local/file_2' INTO TABLE tablename;