Hadoop:仅使用reduce Iterable的一部分

时间:2013-12-30 19:14:56

标签: mapreduce

我有一种情况,我只想使用给予reducer的Iterable的前n个值,然后中止。我一直在阅读关于Iterable类的内容,看起来这可能不是一件容易的事。

我不能使用for循环或下一个方法。我不能使用foreach,因为它遍历整个对象。有没有直接的解决方案,还是我接近问题?

感谢。

1 个答案:

答案 0 :(得分:0)

你可以从iterable中提取迭代器并使用一个好的旧for循环或while循环。

例如,下面仅对最初的TOPN值进行求和。

public static class Reduce extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable result = new IntWritable();
    private static final int TOPN = 10;

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
        throws IOException, InterruptedException
    {
        int sum = 0;
        Iterator<IntWritable> iter = values.iterator();
        for (int i=0; iter.hasNext() && i < TOPN; i++) {
            sum += iter.next().get();
        }
        result.set(sum);
        context.write(key, result);
    }
}