2016-01-27 64 views
0

下表在運行select語句在蜂巢外部表 - 位置

CREATE EXTERNAL TABLE foo (
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\073' 
LINES TERMINATED BY '\n' 
LOCATION '/user/data/CSV/2016/1/27/*/part-*'; 

我需要我的蜂箱所以作爲MapReduce工作投入的一部分文件的文件夾中,並指向一個動態文件夾沒有返回數據配置單元加載到表中。

有什麼辦法位置進行動態像

/user/data/CSV/*/*/*/*/part-* 

或只是/user/data/CSV/*會做罰款?

(當內部表創建並加載文件路徑相同的代碼工作正常 - 因此不存在因格式問題),你的表定義缺少列

回答

1

第一。其次,外部表格位置總是指向文件夾,而不是特定的文件。 Hive會將該文件夾中的所有文件視爲該表的數據。

如果您有生成的數據,例如每天通過一些外部過程,你應該考慮按日期劃分你的表。然後,您需要在數據可用時向表中添加新分區。

+0

我沒有在這裏提到表格列 - Hive可以在不分區的情況下訪問多個文件夾嗎? –

+0

不知道。你需要嘗試。 – LiMuBei

+0

謝謝李慕貝 - 我剛剛解決了上述問題..歡迎任何其他方法,這可以提高 –

0

蜂房不會通過多個文件夾重複 - 因此,對於上述方案 我跑了一個命令行參數,通過這些多個文件夾和貓迭代(打印到控制檯)的所有部分文件,然後把它所需的(Hive指向)

hadoop fs -cat /user/data/CSV/*/*/*/*/part-* | hadoop fs -put - <destination folder> 
0

您可以使用alter table語句來更改位置。在下面的示例中,分區基於數據存儲在時間相關文件位置中的日期。如果我想搜索很多天,​​我必須爲每個位置添加一個alter table語句。這個想法可能會很好地延伸到你的情況。您可以使用其他一些技術(如python)創建一個腳本來生成create table語句。

CREATE EXTERNAL TABLE foo (
) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\073' 
LINES TERMINATED BY '\n' 
; 
alter table foo add partition (date='20160201') location /user/data/CSV/20160201/data; 
alter table foo add partition (date='20160202') location /user/data/CSV/20160202/data; 
alter table foo add partition (date='20160203') location /user/data/CSV/20160203/data; 
alter table foo add partition (date='20160204') location /user/data/CSV/20160204/data; 

您可以使用盡可能多的添加和刪除語句來定義您的位置。然後,您的表格可以在HDFS中的許多位置查找數據,而不是將所有文件都放在一個位置。

你也可以能夠利用一個

create table like 

聲明。創建一個像你在另一個表中一樣的模式。然後改變表格以指向你想要的文件。

我知道這不完全是你想要的,更多的是解決問題。祝你好運!

+0

感謝invoketheshell。,我給你一個想法..目前我正在運行一個自動腳本,獲取來自此文件夾(日期「+%Y /%m /%d)的文件將其放置在單獨的文件夾中, –

0

此行

 LOCATION '/user/data/CSV/2016/1/27/*/part-*'; 

不看起來是正確的,我不認爲該表可從多個位置創建。您是否嘗試過通過單個位置導入來確認此問題?

也可能是您使用的分隔符不正確。如果您使用CSV文件導入數據,請嘗試使用','進行分隔。