分享

为何Reduce端的value值会用Iterator来遍历,不能用别的吗?

haisongen 发表于 2016-11-23 18:28:53 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 7855
如题:
为何Reduce端的value值要使用Iterator,遍历key所对应的所有值,也可以用其他方法来遍历吧。
大神,老司机们求教一下

已有(6)人评论

跳转到指定楼层
arsenduan 发表于 2016-11-23 19:00:22
可以啊,因为reduce的参数一般是集合。遍历的方式有多种。

比如使用for循环
  //实现reduce函数

        public void reduce(IntWritable key,Iterable<IntWritable> values,Context context)

                throws IOException,InterruptedException{

            for(IntWritable val:values){

                context.write(linenum, key);

                linenum = new IntWritable(linenum.get()+1);

            }


也可以使用Iterator


   public static class Reduce extends

            Reducer<Text, IntWritable, Text, IntWritable> {

        // 实现reduce函数

        public void reduce(Text key, Iterable<IntWritable> values,

                Context context) throws IOException, InterruptedException {

            int sum = 0;

            int count = 0;

            Iterator<IntWritable> iterator = values.iterator();

            while (iterator.hasNext()) {

                sum += iterator.next().get();// 计算总分

                count++;// 统计总的科目数

            }

            int average = (int) sum / count;// 计算平均成绩

            context.write(key, new IntWritable(average));

        }

    }


回复

使用道具 举报

haisongen 发表于 2016-11-23 22:50:02
arsenduan 发表于 2016-11-23 19:00
可以啊,因为reduce的参数一般是集合。遍历的方式有多种。

比如使用for循环

谢谢回复,我刚学MR,表述的不太清楚。我想问的是:public void reduce(IntWritable key,Iterable<IntWritable> values,Context context)  这里面这个Iterator 是为何要用它的
回复

使用道具 举报

qcbb001 发表于 2016-11-24 07:37:24
haisongen 发表于 2016-11-23 22:50
谢谢回复,我刚学MR,表述的不太清楚。我想问的是:public void reduce(IntWritable key,Iterable values, ...

这要从mapreduce原理说,map是用来分割数据的,通过分区函数,将数据分类到reduce中。reduce中产生一个个集合。所以需要循环遍历


如下图,看懂了就明白了



来自:
mapreduce学习指导及疑难解惑汇总
http://www.aboutyun.com/forum.php?mod=viewthread&tid=7091



更多:

书籍分享:Hadoop 技术内幕:深入解析 MapReduce 架构设计与实现原理
http://www.aboutyun.com/forum.php?mod=viewthread&tid=5179

MapReduce程序的工作过程
http://www.aboutyun.com/forum.php?mod=viewthread&tid=15494





回复

使用道具 举报

haisongen 发表于 2016-11-24 16:40:21
qcbb001 发表于 2016-11-24 07:37
这要从mapreduce原理说,map是用来分割数据的,通过分区函数,将数据分类到reduce中。reduce中产生一个个 ...

十分感谢!!!!感谢老司机的帮助!!
回复

使用道具 举报

dylen~woo 发表于 2016-11-24 17:41:57
因为数据并不是一下被拉取到内存,因为如果这样的话内存会可能溢出,所以会通过iterator去逐步拉取一部分。这是我自己的理解
回复

使用道具 举报

haisongen 发表于 2016-11-24 17:58:47
dylen~woo 发表于 2016-11-24 17:41
因为数据并不是一下被拉取到内存,因为如果这样的话内存会可能溢出,所以会通过iterator去逐步拉取一部分。 ...

我问了问其他人,有人说是因为Iterator的遍历速度更快一些,所以才使用它的 ^_^
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条