2012-12-20 48 views
1

我寫了我的UDF來加載文件到Pig中。它適用於加載文本文件,但是,現在我還需要能夠讀取.gz文件。我知道我可以解壓縮文件然後處理,但我想只讀.gz文件而不解壓縮。PIG UDF加載.gz文件失敗

我有我的UDF擴展從LoadFunc,然後在我的成本輸入文件MyInputFile extends TextInputFormat。我也實現了MyRecordReader。只是想知道如果延伸TextInputFormat是問題嗎?我試過FileInputFormat,仍然無法讀取文件。有人在寫過UDF之前從.gz文件中讀取數據?

+1

'TextInputFormat'可以處理gzip文件。看看它的RecordReader('LineRecordReader')'initialize()'方法,其中適當的CompressionCodec被初始化。另請注意,gzip文件不可拆分。 –

+0

感謝您指出這一點。如果它不可拆分,那麼我認爲我會考慮首先解壓縮它。非常感謝,如果你能指出一些最好的做法,先解壓縮文件然後加載到PIG。像這樣做的最好方法是什麼?謝謝。 –

+0

不知道數據大小,最簡單的方法是將數據_uncompressed_存儲在hdfs上。您也可以使用可拆分格式('LZO')對其進行重新打包。如何提取gzip文件;本地磁盤 - > HDFS,請參閱: http://bigdatanoob.blogspot.hu/2011/07/copy-and-uncompress-file-to-hdfs.html。如果已經在hdfs上:''hadoop fs -cat /data/data.gz | gzip -d | hadoop fs -put -/data/data.txt' –

回答

0

TextInputFormat處理gzip文件以及。看看它的RecordReader的(LineRecordReader)initialize()方法,其中正確的CompressionCodec被初始化。還要注意,gzip文件不可拆分(即使它們位於S3上),因此您可能需要使用可拆分格式(例如LZO)或未壓縮數據來利用所需級別的並行處理。

如果您的gzip壓縮數據存儲在本地,您可以按照here的說明一步步解壓並將其複製到hdfs。或者如果它已經在hdfs
hadoop fs -cat /data/data.gz | gzip -d | hadoop fs -put - /data/data.txt會更方便。

+0

順便說一句,如果在HDFS中並且想從S3讀取.gz文件並保存到HDFS中,那麼運行'hadoop fs -cat s3n://yourbuckets/yourfile.gz | gzip -d> yourfile.txt'。 –