2013-01-07 31 views
6

我寫類似下面的豬拉丁文字:如何將標題行添加到從Pig(Hadoop)創建的文件中?

A = load 'data' using PigStorage('\t'); 
store A into my_data using PigStorage(); 

此輸出

(Bob, 10, 4.0) 
(Jim, 11, 3.25) 
(Paul, 9, 2.75) 

我想第一個標題行添加到存儲在HDFS

每個文件
(Name, Age, GPA) 
(Bob, 10, 4.0) 
(Jim, 11, 3.25) 
(Paul, 9, 2.75) 

任何想法?

回答

11

這對豬來說並不合適。每條線都是一個單獨的數據記錄,所以除非確實有一個名爲Name,年齡爲Age,並且GPA爲GPA的人,否則有這樣的錯誤。此外,Pig不保證字段的輸出順序(除非使用ORDER BY),因此您的標題行可能會出現在任何地方。

您要求的是一種在Pig完成其工作後保持模式的方法,以便您不必記住它是什麼或在某處查找它。從Pig 0.10開始,通過將關係模式作爲JSON文件.pig_schema存儲在與輸出相同的目錄中,可以使用PigStorage。請參閱this page瞭解更多關於什麼是以及如何使用它的詳細信息。

+6

通過解釋爲什麼開發人員不添加它,您只是證明缺少某項功能。 如果最終消費者真的想要它,你會反駁爲什麼它沒有意義嗎? –

+1

可以通過使用不同的存儲功能。看到我的答案的鏈接:http://stackoverflow.com/questions/14204275/how-can-i-add-a-header-row-to-files-created-from-pig-hadoop/31155621#31155621 –

1

答案是否定的,你不能做你真正想做的事情。

正如@Winni所建議的,通過保留一個模式文件有一些解決方法,但這是很多黑客行爲。

戴着消費者帽子(我也是開發者),我不得不說Pig沒有這個特性。 當PigStorage輸出的東西基本上是一個CSV文件時,我們並不關心它爲豬提供多少意義,以便提供也具有標題行的能力,讓那些小心謹慎的用戶能夠理解數據。

當我有一行時,有大約十個不同的日期時間,並且使我幾乎不可能理解數據,直到手動添加標題行。

0

我認爲你最好的選擇是在Grunt shell的測試集上描述你要輸出的關係,然後把&粘貼到一個例如。 bash命令,可以在你從HDFS中獲取記錄並將其記錄到平面文件後將記錄追加到文件的頂部。因此,像:

sed -i '1s/^/(Name, Age, GPA) /' filename.tsv 

(注意,寫了這個會寫就地,所以也許直接輸出到一個新的文件,如果你是一個shell命令的n00b)

+1

我希望很明顯,這個解決方案作用於從HDFS輸出的部分*文件的連接,而不是存儲在HDFS中的文件。正如之前的海報所指出的那樣,通過HDFS的某些輸出來完成您想做的事情會更有意義。 –

10

您可以使用CSVExcelStorage作爲存儲功能,讓您精確地做你想做的:

STORE輸出轉換成 '/ outputfolder /' 使用 org.apache.pig.piggybank.storage.CSVExcelStorage( '\ T', 'NO_MULTILINE' ,'UNIX','WRITE_OUTPUT_HEADER');

使用「WRITE_OUTPUT_HEADER」選項將頭文件寫入每個滿足您的用例的文件。

相關問題