- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想在一个作业中同时输出gzip
和lzo
格式。
我使用了 MultipleOutputs
,并像这样添加了两个命名输出:
MultipleOutputs.addNamedOutput(job, "LzoOutput", GBKTextOutputFormat.class, Text.class, Text.class);
GBKTextOutputFormat.setOutputCompressorClass(job, LzoCodec.class);
MultipleOutputs.addNamedOutput(job, "GzOutput", TextOutputFormat.class, Text.class, Text.class);
TextOutputFormat.setOutputCompressorClass(job, GzipCodec.class);
(这里的GBKTextOutputFormat
是我自己写的扩展了FileOutputFormat
)
它们被用在 reducer 中,例如:
multipleOutputs.write("LzoOutput", NullWritable.get(), value, "/user/hadoop/lzo/"+key.toString());
multipleOutputs.write("GzOutput", NullWritable.get(), value, "/user/hadoop/gzip/"+key.toString());
结果是:
我可以在两个路径中获得输出,但它们都是 gzip
格式。
有人可以帮助我吗?谢谢!
============================================= ===========================
更多:
刚刚看了FileOutputFormat
中setOutputCompressorClass
的源码,其中conf.setClass("mapred.output.compression.codec", codecClass, CompressionCodec.class);
似乎配置中的mapred.output.compression.codec会在调用setOutputCompressorClass时被重置。
所以实际的压缩格式是我们最后设置的,不能在同一个作业中设置两种不同的压缩格式吗?还是有其他东西被忽略了?
最佳答案
所以也许作为一种变通方法,尝试直接在配置中设置正确的 outputCompressorClass
context.getConfiguration().setOutputCompressorClass(GzipCodec.class);
就在您对每个输出进行写入调用之前。看起来除了键类、值类和输出路径之外的任何输出格式配置参数都没有被 MultipleOutputs 很好地处理,我们可能不得不编写一些代码来弥补这种疏忽。
关于Hadoop:如何在同一个作业中输出不同的格式类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953010/
我是一名优秀的程序员,十分优秀!