Hadoop提供的reduce函数中Iterable 接口只能遍历一次的问题
2014-05-18 17:00
316 查看
今天在写MapReduce中的reduce函数时,碰到个问题,特此记录一下:
void reduce(key, Iterable<*>values,...)
{
for(* v:values)
{
//做第一遍遍历
}
for(* v:values)
{
//做第二遍遍历
}
}
以上代码本以为可以直接通过,但是问题却出现了,就是在第二遍遍历的时候,遍历为空,这也就是说系统给reduce提供的iterable不能多次遍历。
但通过如下的代码片段却发现:
....
List<*> list = ArrayList<*>();
for(* t : list)
{
//第一遍遍历
}
for(*t : list)
{
//第二遍遍历
}
以上代码完全没有问题,因此这也就对刚才的问题提出了一个解决思路,即 先通过一边的遍历将所有内容保存到一个List中,之后再一遍一遍的边这个List即可解决 问题了。
加入ArrayList里面的应该是 新的引用,比如
list.add(new Text(value))
如下代码
public void reduce(IntWritable key, Iterable<MatrixElements> values,
Context context) throws IOException, InterruptedException {
List<MatrixElements> matrixAs = new LinkedList<MatrixElements>();
List<MatrixElements> matrixBs = new LinkedList<MatrixElements>();
for(MatrixElements e : values){
System.out.println("In Reduce: " + key + "\t" + e.toString());
if(e.type.equals("matrixA")){
matrixAs.add(e);
}else if(e.type.equals("matrixB")){
matrixBs.add(e);
}
}
// test
for(MatrixElements e : matrixAs){
System.out.println("In MatrixA: " + e.toString());
}
for(MatrixElements e : matrixBs){
System.out.println("In MatrixB: " + e.toString());
}
// end test
...
}
输出结果为
可以看到应用e一直指向一个特定的对象,
将matrixAs.add(e); 改为matrixAs.add(new MatrixElements(e));结果正常
void reduce(key, Iterable<*>values,...)
{
for(* v:values)
{
//做第一遍遍历
}
for(* v:values)
{
//做第二遍遍历
}
}
以上代码本以为可以直接通过,但是问题却出现了,就是在第二遍遍历的时候,遍历为空,这也就是说系统给reduce提供的iterable不能多次遍历。
但通过如下的代码片段却发现:
....
List<*> list = ArrayList<*>();
for(* t : list)
{
//第一遍遍历
}
for(*t : list)
{
//第二遍遍历
}
以上代码完全没有问题,因此这也就对刚才的问题提出了一个解决思路,即 先通过一边的遍历将所有内容保存到一个List中,之后再一遍一遍的边这个List即可解决 问题了。
加入ArrayList里面的应该是 新的引用,比如
list.add(new Text(value))
如下代码
public void reduce(IntWritable key, Iterable<MatrixElements> values,
Context context) throws IOException, InterruptedException {
List<MatrixElements> matrixAs = new LinkedList<MatrixElements>();
List<MatrixElements> matrixBs = new LinkedList<MatrixElements>();
for(MatrixElements e : values){
System.out.println("In Reduce: " + key + "\t" + e.toString());
if(e.type.equals("matrixA")){
matrixAs.add(e);
}else if(e.type.equals("matrixB")){
matrixBs.add(e);
}
}
// test
for(MatrixElements e : matrixAs){
System.out.println("In MatrixA: " + e.toString());
}
for(MatrixElements e : matrixBs){
System.out.println("In MatrixB: " + e.toString());
}
// end test
...
}
输出结果为
In Reduce: 0 matrixB:0-1 88.0
In Reduce: 0 matrixB:0-3 15.0
In Reduce: 0 matrixB:0-3 43.0
In Reduce: 0 matrixB:0-0 12.0
In Reduce: 0 matrixB:0-2 3.0
In Reduce: 0 matrixB:0-3 26.0
In Reduce: 0 matrixA:2-0 52.0
In Reduce: 0 matrixA:1-0 62.0
In MatrixA: matrixA:1-0 62.0
In MatrixA: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
In MatrixB: matrixA:1-0 62.0
可以看到应用e一直指向一个特定的对象,
将matrixAs.add(e); 改为matrixAs.add(new MatrixElements(e));结果正常
相关文章推荐
- Hadoop提供的reduce函数中Iterable 接口只能遍历一次的问题
- Hadoop提供的reduce函数中Iterable 接口只能遍历一次的问题
- Reservoir Sampling 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题
- 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题
- Reservoir Sampling 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题
- Hadoop reduce阶段遍历Iterable的问题及解决方案
- Reservoir Sampling 蓄水池抽样 海量数据不知道总数只能遍历一次随机抽样问题
- 解决“您一次只能安装一种 Adobe 产品”问题
- .net利用程序集的GUID解决程序只能运行一次的问题
- 终于解决了nRF24L01接收端只能接收一次数据的问题
- jQuery ui1.7 dialog只能弹出一次问题
- 问题10:还是单链表的一些问题(如单链表,怎样只遍历一次就可以求出中间结点)
- 一次遍历,等概率随机排列数组与带权随机选取问题
- 使用IAccessible接口,遍历DirectUI窗口控件的问题?
- web.py 使用 db.select 返回的数据只能遍历一次
- netbeans下 解决glassFish只能启动一次的问题
- Servlet的Request.getInputStream()只能读取一次问题
- C# WebServices接口提供C++调用的数据包问题
- C#实现一次只能打开一个客户端以及关闭自动重启的问题
- 您一次只能安装一种 Adobe 产品问题的解决