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 中的 SimpleTextLoader UDF

Pig UDF 抛出错误 Caught error from UDF: GetCounty, Out of bounds access [1]

在 PIg 脚本中对 Avro 文件使用 UDF

在本地运行 pig,UDF 程序无法写入文件/文件夹:PriviledgedActionException

Apache Pig 将整个关系加载到 UDF

使用 UDF 在 Pig 中解析 XML 文件