分享

新手指导:让你真正了解mapreduce中map函数与reduce函数功能及key与value的含义

pig2 发表于 2014-5-1 01:04:40 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 18 116859
本帖最后由 pig2 于 2014-5-1 01:20 编辑
问题导读:
1.我们所定义的map函数与reduce函数是用来干什么的?
2.key和value分别代表什么意思?






很多在写mapreduce,但是有的写的不太明白,并不太了解我们为什么这么写。
首先说map函数中的key和value

Key:
都说是偏移量,这里换另外一种说法,我们是否知道字符串的长度,使得也就是说我们首先计算一个字符串的长度,然后按照字符串来进行不断的分割。

value:
value这个值,是我们真正使用的,我们也就是对其进行分割。

我们知道了上面,而且有很多的解说,但是这里面很多人还是很迷惑。为什么那?下面整体来讲讲:
加入一个文件的内容:
1,2,3,4
a,b,c,d
1,a,2,b

上面是一个文件的内容。
那么我们来看了。
上面那一个是map中的输入值,会有几个map。正常情况下:会有三个map值。
这里又会产生问题了,那么这三行数据,是谁划分的,是由谁来做的,由FileInputFormat来帮我们做的工作

好了,继续:
那么value是什麽?
1,2,3,4这就是所传递的value值。
我们所作的工作是什麽?
进一步的划分数据,也就是进一步的分割这个字符串。
分割之后,我们传递给reduce。

我们所书写的reduce完成了什么工作。
其实我们完成一个输出的工作:
有多少个分区就有多少个reduce。也就是说,我们所做的只不过是一个计数的工作。

怎么计数的那?对谁计数?
比如
分区1:两个1
分区2:两个2
分区3:一个b
........
这里的分区可以理解一个容器:容器里装着什么,被分组的数据。我们所定义的reduce做了什么工作:数数,数这里面装个几个数据。

那么数数怎么实现,就是通过下面进行数数的。
  1.   for (IntWritable val : values) {
  2.             sum += val.get();
  3.             System.out.println("val.get():" + val.get());
  4.         }
复制代码





本文链接:http://www.aboutyun.com/thread-7555-1-1.html



本帖被以下淘专辑推荐:

已有(18)人评论

跳转到指定楼层
czs208112 发表于 2017-4-9 09:30:27
本帖最后由 czs208112 于 2017-4-9 09:37 编辑

我来补充补充:
map方法的key是一个偏移量,value是每一行的数据。以楼主给的文本为例(注意,我把中文逗号改成了英文逗号,要不然每行长度不是7):
1,2,3,4
a,b,c,d
1,a,2,b
三行数据会调用map方法3次,第一次key为0,value为"1,2,3,4",第二次key为9,即上一次value的长度+2,至于为什么是这样,我还没看源码,只是我实际调试的规律,value为"a,b,c,d"。同理,第三次key为18,value为"1,a,2,b"


回复

使用道具 举报

czs208112 发表于 2017-8-8 14:40:50
mapc 发表于 2017-5-19 00:12
因为换行符占两个字节长度,所以加2

对的,多的2位是换行符,我当时只是看的debug的数据,一时没想明白。说实话,aboutyun的许多理论的教程我都觉得云里雾里的,不过新手入门的那几个挺不错。
回复

使用道具 举报

maizhu 发表于 2014-10-8 10:39:54
回复

使用道具 举报

式微 发表于 2015-5-22 11:16:58
key的解释有点迷糊,楼主帮我看看我的理解对吗:map有3个,key是作为计算一个字符串的个数的操作,那么每行是4个数,key为4,对应的value就是那行的4个数值?
回复

使用道具 举报

leo_1989 发表于 2015-5-22 12:41:07
式微 发表于 2015-5-22 11:16
key的解释有点迷糊,楼主帮我看看我的理解对吗:map有3个,key是作为计算一个字符串的个数的操作,那么每行 ...

key是偏移量
回复

使用道具 举报

式微 发表于 2015-5-22 15:18:39

“都说是偏移量,这里换另外一种说法,我们是否知道字符串的长度,使得也就是说我们首先计算一个字符串的长度,然后按照字符串来进行不断的分割。”
就是没读懂楼主的这句话。。。偏移量能懂
回复

使用道具 举报

fjm3232832 发表于 2015-10-1 11:52:55
我也没有太明白
回复

使用道具 举报

pianai 发表于 2015-11-1 16:05:48
学习一下,谢谢楼主~
回复

使用道具 举报

烤火鸡 发表于 2015-11-19 22:23:32
越解释越糊涂
回复

使用道具 举报

zhzhang 发表于 2015-12-24 16:12:14
各位大神,问一下:假设我程序只过滤日志,不做处理,那么map函数在输出的时候怎么写?context.write(new Text(), new Text(lineNew)); 这么写的话,会导致每行开头都有一段空白,求大神赐教
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条