2013-08-16 73 views
2

我有一個格式相同的csv文件的hdfs文件列表。我需要能夠將他們與豬一起LOAD。例如:使用PigLatin(Hadoop)加載多個文件

/path/to/files/2013/01-01/qwe123.csv 
/path/to/files/2013/01-01/asd123.csv 
/path/to/files/2013/01-01/zxc321.csv 
/path/to/files/2013/01-02/ert435.csv 
/path/to/files/2013/01-02/fgh987.csv 
/path/to/files/2013/01-03/vbn764.csv 

因爲他們的名字是「隨機」的哈希和他們的目錄可能包含多個CSV文件,它們不能被globed。

+2

http://stackoverflow.com/a/7341236/2103450 – jtravaglini

+0

所以只需用逗號分隔, 哈! – ddinchev

回答

1

正如在其他意見建議,可以通過處理前的文件做到這一點。假設你的HDFS文件名爲file_list.txt,那麼你就可以做到以下幾點:

pig -param flist=`hdfs dfs -cat file_list.txt | awk 'BEGIN{ORS="";}{if (NR == 1) print; else print ","$0;}'` script.pig 

awk代碼擺脫了換行符,並使用逗號分隔的文件名。

在腳本(在我的例子叫做script.pig),你應該使用參數替換加載數據:

data = LOAD '$flist'; 
+0

你有什麼想法如何逃離分隔符?因爲我的文件名似乎包含逗號:( – ddinchev

1

您並不侷限於通配符。使用此:

LOAD '/path/to/files/2013/01-{01/qwe123,01/asd123,01/zxc321,02/ert435,02/fgh987,03/vbn764}.csv';

+0

解析文件名會是一種負擔,也是我無法控制我在文件中獲得的路徑。他們可能會改變。 – ddinchev

+0

構建一個類似於「{path1,path2,path3}」的字符串並將其作爲參數傳入。 –

+0

@Veseliq運行一個shell腳本來獲取你感興趣的文件名,並將它們連接到像上面提到的winnie這樣的字符串。 – jtravaglini