我编写了一个MapReduce应用程序,其中映射器以下列形式生成输出:
key1 value1
key2 value2
keyn valuen
我想要做的是总结我的reducer中所有键的所有值。基本上是:
sum = value1+value2+value3
这可能吗?根据我的理解,目前为每个键/值对分别调用reducer。我想到的一个解决方案是使私有和变量保持到目前为止的值过程的总和。但是,在这种情况下,我怎么知道所有的对都已被处理,以便总和可以写到收集器?
答案 0 :(得分:2)
如果您不需要密钥,请使用单个常量密钥。如果必须有多个键值,则可以将reducers的数量设置为1,并使用reducer类中的实例变量来保存所有值的总和。在setup()方法中初始化变量,并在close()方法中报告总和。
另一种方法是通过使用reduce方法中的和递增计数器来写入给定键的值的总和。让hadoop将所有值组合在一个计数器值中。
答案 1 :(得分:0)
我也是Hadoop的新手,在研究同一个问题时,我发现Mapper和Reducer类还有setup()和cleanup()方法以及map()和reduce()。
首先,将Reducers的数量设置为1。
public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
int sum=0
public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
for (IntWritable value : values)
{
sum += value.get();
}
}
@Override
protected void cleanup(Context context) throws IOException, InterruptedException {
context.write(new Text("Sum:", new IntWritable(sum));
}
}