今天在写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
...
}
输出结果为
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 接口只能遍历一次的问题的更多相关文章

  1. Java中Map接口的遍历

    package Test4; import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import ...

  2. mapreduce中reduce中的迭代器只能调用一次。其实迭代器就只能调用一次

    亲测,只能调用一次,如果想想在一次reduce重复使用迭代器中的数据,得先取出来放在list中然后在从list中取出来!!多次读取reduce函数中迭代器的数据 public static void ...

  3. 使用eclipse的快捷键自动生成的map或者reduce函数的参数中:“org.apache.hadoop.mapreduce.Reducer.Context context”

    今天在测试mapreduce的程序时,就是简单的去重,对照课本上的程序和自己的程序,唯一不同的就是“org.apache.hadoop.mapreduce.Reducer.Context contex ...

  4. hadoop中OutputFormat 接口的设计与实现

    OutputFormat 主要用于描述输出数据的格式,它能够将用户提供的 key/value 对写入特定格式的文件中. 本文将介绍 Hadoop 如何设计 OutputFormat 接口 , 以及一些 ...

  5. 12.Java中Comparable接口,Readable接口和Iterable接口

    1.Comparable接口 说明:可比较(可排序的) 例子:按照MyClass的y属性进行生序排序 class MyClass implements Comparable<MyClass> ...

  6. Python中的map()函数和reduce()函数的用法

    Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下   Py ...

  7. python中的map、filter、reduce函数

    三个函数比较类似,都是应用于序列的内置函数.常见的序列包括list.tuple.str.   1.map函数 map函数会根据提供的函数对指定序列做映射. map函数的定义: map(function ...

  8. Python3版本中的filter函数,map函数和reduce函数

    一.filter函数: filter()为已知的序列的每个元素调用给定的布尔函数,调用中,返回值为非零的元素将被添加至一个列表中 def f1(x): if x>20: return True ...

  9. python3中reduce()函数的使用方法示例

      reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学 ...

随机推荐

  1. 九度oj 题目1337:寻找最长合法括号序列

    题目描述: 给你一个长度为N的,由’(‘和’)’组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的含义便是,在这个序列中,所有的左括号都有唯一的右括号匹配:所有的右括号都有唯一的 ...

  2. 30分钟学会如何使用Shiro(转自:http://www.cnblogs.com/learnhow/p/5694876.html)

    本篇内容大多总结自张开涛的<跟我学Shiro>原文地址:http://jinnianshilongnian.iteye.com/blog/2018936 我并没有全部看完,只是选择了一部分 ...

  3. 【Luogu】P3856公共子串(DP)

    题目链接 DP.设last[i][j]是第i个串字符'j'所在的最后的位置,f[i][j][k]是第一个串匹配到i,第二个串匹配到j,第三个串匹配到k,最多的公共子串数. 那么我们三重循环i.j.k, ...

  4. POJ 2888 Magic Bracelet ——Burnside引理

    [题目分析] 同样是Burnside引理.但是有几种颜色是不能放在一起的. 所以DP就好了. 然后T掉 所以矩阵乘法就好了. 然后T掉 所以取模取的少一些,矩阵乘法里的取模尤其要注意,就可以了. A掉 ...

  5. BZOJ 3750: [POI2015]Pieczęć 【模拟】

    Description 一张n*m的方格纸,有些格子需要印成黑色,剩下的格子需要保留白色. 你有一个a*b的印章,有些格子是凸起(会沾上墨水)的.你需要判断能否用这个印章印出纸上的图案.印的过程中需要 ...

  6. 刷题总结——蜥蜴(ssoj网络流)

    题目: 题目背景 SCOI2007 DAY1 T3 题目描述 在一个 r 行 c 列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外.每行每列中相邻石柱的距 ...

  7. 算法复习——半平面交(bzoj2618凸多边形)

    讲解: 这里套用wuvin神犇的ppt,附上友情链接:http://blog.leanote.com/wuvin 半平面交: 算法流程: 注意事项: 例题: Description 逆时针给出n个凸多 ...

  8. mysql/oracle 连接参数中文变问号

    jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=utf8&useSSL=true

  9. 回顾基础知识,类,fbv,cbv

    一 类中绑定方法的传参,不需要self class Foo(object): def __init__(self,name): self.name = name def foo(self,x): se ...

  10. 【HDOJ5979】Convex(三角函数)

    题意:n个点在一个半径为R的圆上,给出这n个点顺时针的夹角差值,求这n个点的凸包面积 n<=10,R<=10 思路:S=1/2*sinθ*a*b 角度转弧度再用sin C++有点小毛病,叫 ...