如何在Apache Pig中使用PigStorage存储gzip压缩文件?

时间:2011-02-11 12:12:18

标签: apache-pig

Apache Pig v0.7可以读取gzip文件而不需要额外的努力,例如:

MyData = LOAD '/tmp/data.csv.gz' USING PigStorage(',') AS (timestamp, user, url);

我可以处理该数据并将其输出到磁盘好了:

PerUser = GROUP MyData BY user;
UserCount = FOREACH PerUser GENERATE group AS user, COUNT(MyData) AS count;
STORE UserCount INTO '/tmp/usercount' USING PigStorage(',');

但输出文件未压缩:

/tmp/usercount/part-r-00000

有没有办法告诉STORE命令以gzip格式输出内容?请注意,理想情况下我想要一个适用于Pig 0.6的答案,因为我希望使用Amazon Elastic MapReduce;但如果有任何版本的猪的解决方案,我想听听它。

3 个答案:

答案 0 :(得分:14)

有两种方法:

  1. 如上所述,您可以将输出目录称为

    usercount.gz STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');

  2. 在脚本中设置压缩方法。

    set output.compression.enabled true; set output.compression.codec org.apache.hadoop.io.compress.GzipCodec;

答案 1 :(得分:10)

对于Pig r0.8.0,答案很简单,就是给你的输出路径扩展为“.gz”(如果你更喜欢bzip,则为“.bz”)。

您的代码的最后一行应修改为:

STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');

根据您的示例,您的输出文件将被找到

/tmp/usercount.gz/part-r-00000.gz

有关详细信息,请参阅:https://pig.apache.org/docs/r0.8.1/piglatin_ref2.html#PigStorage

答案 2 :(得分:3)

根据PigStorage的Pig文档,有两种方法可以做到这一点

使用' STORE'指定压缩格式声明

STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');
STORE UserCount INTO '/tmp/usercount.bz2' USING PigStorage(',');
STORE UserCount INTO '/tmp/usercount.lzo' USING PigStorage(',');

请注意以上陈述。 Pig支持3种压缩格式,即GZip,BZip2和LZO。要让LZO工作,您必须单独安装。有关lzo的详细信息,请参阅here

通过作业属性指定压缩

通过以下代码在您的猪脚本中设置以下属性,即output.compression.enabledoutput.compression.codec

set output.compression.enabled true;

set output.compression.codec com.hadoop.compression.lzo.LzopCodec;
set output.compression.codec org.apache.hadoop.io.compress.GzipCodec;
set output.compression.codec org.apache.hadoop.io.compress.BZip2Codec;