java – 在值上迭代两次(MapReduce)
发布时间:2020-12-15 07:38:20 所属栏目:Java 来源:网络整理
导读:我收到一个迭代器作为参数,我想迭代两次值. public void reduce(PairString,String key,IteratorIntWritable values,Context context) 可能吗 ?怎么样 ? 签名是由我正在使用的框架(即Hadoop)强加的. – 编辑 – 最后,reduce方法的真实签名是可迭代的.我被
我收到一个迭代器作为参数,我想迭代两次值.
public void reduce(Pair<String,String> key,Iterator<IntWritable> values,Context context) 可能吗 ?怎么样 ? – 编辑 – 解决方法
如果要再次迭代,我们必须缓存迭代器中的值.至少我们可以结合第一次迭代和缓存:
Iterator<IntWritable> it = getIterator(); List<IntWritable> cache = new ArrayList<IntWritable>(); // first loop and caching while (it.hasNext()) { IntWritable value = it.next(); doSomethingWithValue(); cache.add(value); } // second loop for(IntWritable value:cache) { doSomethingElseThatCantBeDoneInFirstLoop(value); } (只是用代码添加答案,知道你在自己的评论中提到了这个解决方案;)) 为什么没有缓存是不可能的:迭代器是实现接口的东西,没有一个要求,Iterator对象实际存储值.迭代两次你必须重置迭代器(不可能)或克隆它(再次:不可能). 举一个迭代器的例子,其中克隆/重置没有任何意义: public class Randoms implements Iterator<Double> { private int counter = 10; @Override public boolean hasNext() { return counter > 0; } @Override public boolean next() { count--; return Math.random(); } @Override public boolean remove() { throw new UnsupportedOperationException("delete not supported"); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |