2012-12-04 50 views
9

我遇到了很多的麻煩數據出來的豬,併成爲一個CSV,我可以沒有很多操作在Excel或SQL(或R或SPSS等)因使用...出口從豬CSV

我使用下面的函數嘗試:

STORE pig_object INTO '/Users/Name/Folder/pig_object.csv' 
    USING CSVExcelStorage(',','NO_MULTILINE','WINDOWS'); 

它與大量的一部分-M-0000#文件名創建該文件夾。我以後可以使用cat部分*> filename.csv加入它們,但是沒有頭部,這意味着我必須手動將它放入。

我讀過PigStorageSchema應該創建另一個頭的一個頭,但它似乎並沒有工作,例如,我得到的結果就好像它只是存儲,沒有頭文件: STORE pig_object INTO '/用戶/名稱/文件夾/ p​​ig_object' USING org.apache.pig.piggybank.storage.PigStorageSchema();

(我在本地和MapReduce模式嘗試這樣做)。

是否有失控豬的數據到一個簡單的CSV文件中沒有這些多個步驟的方法嗎?

任何幫助將不勝感激!

回答

28

恐怕沒有一個班輪其做工作,但你可以拿出以下(豬v0.10.0):

A = load '/user/hadoop/csvinput/somedata.txt' using PigStorage(',') 
     as (firstname:chararray, lastname:chararray, age:int, location:chararray); 
store A into '/user/hadoop/csvoutput' using PigStorage('\t','-schema'); 

PigStorage採取「-schema」它將在輸出目錄中創建'.pig_schema'和'.pig_header'。然後,你必須用「part-x-xxxxx」合併「.pig_header」:

如果結果需要由複製到本地磁盤:

hadoop fs -rm /user/hadoop/csvoutput/.pig_schema 
hadoop fs -getmerge /user/hadoop/csvoutput ./output.csv 

(由於-getmerge把你需要獲得一個輸入目錄擺脫.pig_schema第一)

2.存儲在HDFS結果:

hadoop fs -cat /user/hadoop/csvoutput/.pig_header 
    /user/hadoop/csvoutput/part-x-xxxxx | 
    hadoop fs -put - /user/hadoop/csvoutput/result/output.csv 

備查你可能也看看這些帖子:
STORE output to a single CSV?
How can I concatenate two files in hadoop into one using Hadoop FS shell?

+0

非常感謝您的幫助,羅蘭。調用shell命令可以清理一些事情。但是,運行它時,-schema參數不會創建.pig_header或.pig_schema文件。我試過使用PigStorage和PigStorageSchema。我正在運行豬0.10.0。 – Saxivore

+0

嗨,隊友,進一步... .pig_header文件_is_創建,但它被隱藏,我看不到它(我仍然習慣於使用shell的東西)。所以,我確實有一個可以在腳本中完成的解決方法,這很棒。謝謝! – Saxivore

+0

@Saxivore檢查'pig_object.'的模式。如果沒有,那麼不會創建任何頭文件和模式文件。你需要更多的幫助來解決這個問題嗎? –

1

,如果你將存儲你的數據PigStorage HDFS上,然後使用-getmerge -nl合併它:

STORE pig_object INTO '/user/hadoop/csvoutput/pig_object' 
    using PigStorage('\t','-schema'); 
fs -getmerge -nl /user/hadoop/csvoutput/pig_object /Users/Name/Folder/pig_object.csv; 

Docs:

任選-nl可以被設置爲使在 添加換行符(LF)的每個文件的結尾。

,你將有一個TSV/CSV結構如下文件:

1 - header 
2 - empty line 
3 - pig schema 
4 - empty line 
5 - 1st line of DATA 
6 - 2nd line of DATA 
... 

,所以我們可以使用AWK簡單地刪除線[2,3,4]

awk 'NR==1 || NR>4 {print}' /Users/Name/Folder/pig_object.csv > /Users/Name/Folder/pig_object_clean.csv