我收到一个迭代器作为参数,我想迭代两次值.
public void reduce(Pair<String,String> key, Iterator<IntWritable> values,
Context context)
可能吗 ?怎么样 ?
签名是由我正在使用的框架(即Hadoop)强加的.
– 编辑 –
最后,reduce方法的真实签名是可迭代的.我被这个wiki page误导了(这实际上是我发现的唯一一个非弃用(但错误的)wordcount的例子).
解决方法:
如果要再次迭代,我们必须缓存迭代器中的值.至少我们可以结合第一次迭代和缓存:
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");
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。