PIG UDF 加载 .gz 文件失败
Posted
技术标签:
【中文标题】PIG UDF 加载 .gz 文件失败【英文标题】:PIG UDF load .gz file failed 【发布时间】:2012-12-20 20:17:18 【问题描述】:我编写了我的 UDF 来将文件加载到 Pig 中。它适用于加载文本文件,但是,现在我还需要能够读取.gz
文件。我知道我可以解压缩文件然后处理,但我只想阅读.gz
文件而不解压缩它。
我的 UDF 从LoadFunc
扩展,然后在我的成本输入文件MyInputFile extends TextInputFormat
中。我还实现了MyRecordReader
。只是想知道扩展TextInputFormat
是否有问题?我试过FileInputFormat
,仍然无法读取文件。之前有人写过UDF从.gz
文件中读取数据吗?
【问题讨论】:
TextInputFormat
可以处理 gzip 文件。看看它的 RecordReader 的 (LineRecordReader
) initialize()
方法,其中初始化了正确的 CompressionCodec。另请注意,gzip 文件不可拆分。
感谢您指出这一点。如果它不可拆分,那么我想我会考虑先解压缩它。如果您能指出一些预解压缩文件然后加载到 PIG 的最佳实践,将不胜感激。比如最好的方法是什么?谢谢。
在不知道数据大小的情况下,最简单的方法是将数据未压缩存储在 hdfs 上。您也可以使用可拆分格式 (LZO
) 重新打包它。如何提取 gzip 文件;本地磁盘->HDFS,见:bigdatanoob.blogspot.hu/2011/07/…。如果已经在 hdfs 上:hadoop fs -cat /data/data.gz | gzip -d | hadoop fs -put - /data/data.txt
从 S3 怎么样?和它已经在 HDFS 上一样吗?只是想知道你能把你的评论作为答案吗?所以我可以接受你的回答:)
【参考方案1】:
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
会更方便。
【讨论】:
顺便说一句,如果在 HDFS 中并想从 S3 读取 .gz 文件并保存到 HDFS 中,则运行hadoop fs -cat s3n://yourbuckets/yourfile.gz | gzip -d > yourfile.txt
。以上是关于PIG UDF 加载 .gz 文件失败的主要内容,如果未能解决你的问题,请参考以下文章
Pig UDF 抛出错误 Caught error from UDF: GetCounty, Out of bounds access [1]