spark,hadoop交流群,QQ群号:521066396,欢迎加入共同学习,一起进步~
第一次碰到读取reduce函数中迭代器的数据只能取一次的问题。为了优化,在reduce函数中,Iterable values只能被读取一次。查阅相关资料,如果要反复使用,需要克隆或者新生成对象。举个简单例子:
如果在reduce函数中读过values,
for (Text value : values) {
//do what you want
}
当reduce将数据填充到值迭代器的时候,应用了对象重用。这个特性对缓存机制有潜在影响。如果还想再使用values,那么需要克隆或保存新的对象。
List<Text> lists = new ArrayList<Text>();
Iterator<Text> iter = values.iterator();
while (iter.hasNext()) {
lists.add(iter.next());
}
下面是采用克隆的方式。
//创建一个集合,存放
ArrayList<Text> list = new ArrayList<Text>();
for (Text value : values) {
//克隆
Text text = WritableUtils.clone(value,context.getConfiguration());
list.add(text);
}