我有一种情况,我只想使用给予reducer的Iterable的前n个值,然后中止。我一直在阅读关于Iterable类的内容,看起来这可能不是一件容易的事。
我不能使用for循环或下一个方法。我不能使用foreach,因为它遍历整个对象。有没有直接的解决方案,还是我接近问题?
感谢。
答案 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);
}
}