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;但如果有任何版本的猪的解决方案,我想听听它。
答案 0 :(得分:14)
有两种方法:
如上所述,您可以将输出目录称为
usercount.gz
STORE UserCount INTO '/tmp/usercount.gz' USING PigStorage(',');
在脚本中设置压缩方法。
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 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.enabled
和output.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;