Ruby 中一个简单的 wordcount reducer 如下所示:
#!/usr/bin/env ruby
wordcount = Hash.new
STDIN.each_line do |line|
keyval = line.split("|")
wordcount[keyval[0]] = wordcount[keyval[0]].to_i+keyval[1].to_i
end
wordcount.each_pair do |word,count|
puts "#{word}|#{count}"
end
它在 STDIN 中获取所有映射器的中间值。不是来自特定的键。所以实际上所有人只有一个减速器(而不是每个单词或每组单词的减速器)。
但是,在 Java 示例中,我看到这个接口获取一个键和值列表作为 inout。这意味着中间映射值在归约之前按键分组,并且归约器可以并行运行:
public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
output.collect(key, new IntWritable(sum));
}
}
这是 Java 独有的功能吗?或者我可以使用 Ruby 使用 Hadoop Streaming 来做到这一点吗?