A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

    在hadoop中最重要的就是基于hdfs的MapReduce分布式计算模型(以下简称“MR模型”)。hadoop周边的框架都是基于MapReduce做的各种操作,因此MapReduce是学好hadoop的基础。但是,很多初学者对Map、Reduce的本来面目不了解,一时之间不明白map、reduce到底是干什么的,为什么这个样子。下文试图逐一详解。

    Map、Reduce是两个函数,属于函数式编程语言中的固有函数。我们java属于面向对象语言,与函数式编程语言有很大区别。以下就以python为例讲述:

  
a=[1,2,3,4,5]
m = map(
lambda x:x+3, a)
list(m)
#[4, 5, 6, 7, 8]
  

    以上4条语句是用python写的。我现在逐一讲述每条语句。
    第一句是定义一个list,包含5个元素,赋值给一个变量a(python声明时不需要指定数据类型)。
    第二句是关键。其中蓝色的“lambda”是关键词,用于定义一个匿名函数。该匿名函数的形式参数是x,函数定义是返回x+3.那么“lambda x:x+3”就是定义一个匿名函数,形式参数是x,返回x+3。就这么简单。简单的理解为java中new一个接口就行了。好了,继续分析。这里的map就是一个函数。map函数包括两个参数,第一个就是刚才定义的匿名函数,第二个是一个a,即第一句中定义的list。map函数执行后,把返回值赋值给变量m。
    第三句是显示语句,使用list函数显示上面的运算结果m的值。
    第四句是显示第三句的运行结果。我们发现,map函数结果也是一个list,并且list中包含的元素个数与参数a的元素个数相同,但是m中的每个元素都是a中对应元素执行匿名函数的结果。
    以上就是python写的四句代码的全部含义。大家不要纠结python的语法,只需要关注map的含义即可。

  总结Mapper的含义是对输入的列表中的每一个元素执行一个函数,生成一个列表结果。运算前后列表的元素数量不变化

    我们在写MR模型时,覆盖Mapper类的map方法时,map函数的每个输入就是外部文件的每一行啊。这正是上面例子中map函数体现的要点。

    下面来看reduce函数的本来面目,还是以python代码为例:


import functools
a = [1,2,3,4,5]
s = functools.reduce(lambda x,y:x+y,a)
print(s)               
#15                                    
  

    以上一共包含5行python代码。
    第一行是导入类库。
    第二行是声明一个列表,包含5个元素,赋值给一个变量a。
    第三行是关键。首先看到一个匿名函数“lambda x,y:x+y”。该函数两个形式参数x和y。方法体是x+y。函数reduce的参数有两个,第一个是上面讲的匿名函数,第二个是列表a。运算后赋值给变量s。
    第四行是打印s。
    第五行是显示结果15.
    从以上例子可以看到,15是列表a执行匿名函数的结果。

    总结Reduce的含义就是“Reduce是对输入的列表中的所有元素执行一个函数操作,并将中间结果作为参数继续执行函数”。

    好像还是没理解吧?继续向下看Reduce的深度分析。

    Reduce中匿名函数的两个形参是x和y(假设默认值都是0),这个匿名函数在运行时传入的参数是a中的各个元素。其中x分别是1,2,3,4,5;那么y会传入什么值哪?y是x+y的累计值。

    一步步的遍历a中的元素,过程如下:
    1.x、y默认值都是 0
    2.当x=1,y=0时,运算完成后x+y,即1+0,等于1;
    3.当x=2,y=1时,运算完成后x+y,即2+1,等于3;
    4.当x=3,y=3时,运算完成后x+y,即3+3,等于6;
    5.当x=4,y=6时,运算完成后x+y,即4+6,等于10;
    6.当x=5,y=10时,运算完成后x+y,即5+10,等于15;

    可能会感觉到reduce的用法这么奇怪,因为python是函数式编程语言。函数语言中函数是一等公民,就像java中类一样普遍。

    python中的map、reduce函数会分别遍历参数a中的每一个元素,有点类似于java中的for循环,不必扣细节,大体理解就可以。举例子的目的就是为了让大家有个大致了解,方便以后的hadoop学习。

    同学们,理解map、reduce函数的本质了吗?不明白的,请留言吧

41 个回复

倒序浏览
{:soso_e176:}{:soso_e176:}
回复 使用道具 举报
沙发没抢到啊
回复 使用道具 举报
顶一下老师,写的不错
回复 使用道具 举报 1 0
{:soso_e183:}
回复 使用道具 举报
所为的函数 是不是跟类里面的方法一样啊
回复 使用道具 举报
本帖最后由 吴超老师 于 2013-4-4 17:33 编辑
杨杨 发表于 2013-4-4 17:30
所为的函数 是不是跟类里面的方法一样啊

简单地理解:是。

函数式语言python与面向对象语言java,设计思想是不一样的,开发思路也不一样。不要扣语法,重在理解。
回复 使用道具 举报
map函数是把原来的一组数重新建一个映射吗?
reduce函数是干嘛的,字面上是减少的意思,是说把映射的结果简化成一个值,相当于将前面那个map打包起来吗?
回复 使用道具 举报
明白了哈,谢谢老师
总结两句
Mapper的含义是“对输入的列表中的每一个元素执行一个函数,生成一个列表结果。运算前后列表的元素数量不变化。”
Reduce的含义就是“Reduce是对输入的列表中的所有元素执行一个函数操作,并将中间结果作为参数继续执行函数”。
回复 使用道具 举报
老师那个map中的匿名函数中只可以有一个x形参吗,还可以有第二个吗,那lReduce中的匿名函数,可以只有一个形参吗,或多个形参呢,我比较对这个有点疑惑,这个是可以理解的,
回复 使用道具 举报
学习了!:D
回复 使用道具 举报
刘策 发表于 2013-4-4 17:33
老师那个map中的匿名函数中只可以有一个x形参吗,还可以有第二个吗,那lReduce中的匿名函数,可以只有一个 ...

别扣语法细节,把文中红色加粗部分理解就行了。

map中的匿名函数只有一个形参。
reduce中的匿名函数只有两个形参。
回复 使用道具 举报
吴超老师 发表于 2013-4-4 17:39
别扣语法细节,把文中红色加粗部分理解就行了。

map中的匿名函数只有一个形参。

哦,明白。谢谢。
回复 使用道具 举报
黑马高明辉 发表于 2013-4-4 17:33
map函数是把原来的一组数重新建一个映射吗?
reduce函数是干嘛的,字面上是减少的意思,是说把映射的结果简 ...

简单的讲,你的理解是正确的。

函数的本质是映射。看一个函数的定义是什么,作用是什么,就是看函数的形参和返回值。如果纠结这个函数为什么起这个名字,那么学习方向就偏离轨道了。
回复 使用道具 举报
reduce 跟java中的递归有点像啊
回复 使用道具 举报
杨杨 发表于 2013-4-4 17:47
reduce 跟java中的递归有点像啊

非常正确,赞一个:victory:
回复 使用道具 举报
吴超老师 发表于 2013-4-4 17:50
非常正确,赞一个

老师 我想报云3期 看我 这潜质  能走个后门吗 呵呵 正在办理离职
回复 使用道具 举报
吴超老师 发表于 2013-4-4 17:45
简单的讲,你的理解是正确的。

函数的本质是映射。看一个函数的定义是什么,作用是什么,就是看函数的形 ...

恩,也是,不过函数名肯定也有一定的道理。
mapreduce是处理大数据的,我先感性地理解一下,这个是不是要把有的数据重新映射,然后有的数据打包处理。
reduce函数的意义也就是把一些数据相关地打包到一起,这样相当于减少了单个数据的映射数,类似于在检索大量数据的时候先能找到一个reduce的结果,然后在到这个结果里去找具体的哪个数据?
回复 使用道具 举报
本帖最后由 吴超老师 于 2013-4-4 18:07 编辑
黑马高明辉 发表于 2013-4-4 17:52
恩,也是,不过函数名肯定也有一定的道理。
mapreduce是处理大数据的,我先感性地理解一下,这个是不是要 ...

你说的“打包处理”,我不清楚什么意思。另外,你说的“映射数”,是不是我所说的“函数”,我也不确定。

mapreduce本质上是处理大数据的,没错。“处理大数据”就是我们平时对数据的“查重、计数、搜索”等。数据不大的话,这样的问题处理起来很简单。一旦数据量大了,处理就复杂了。原因见http://bbs.itheima.com/thread-44006-1-1.html。mapreduce只是处理大数据的一种模型,处理的思路是先map后reduce。鉴于map和reduce函数的特点,那么mapreduce不是适合于所有的大数据计算问题。只有一部分问题才能转化为mapreduce处理。说得太多了,呵呵
回复 使用道具 举报
杨杨 发表于 2013-4-4 17:51
老师 我想报云3期 看我 这潜质  能走个后门吗 呵呵 正在办理离职

我只负责讲课哦,报名事情还需要咨询具体老师。我可以肯定的是,黑马欢迎你,黑马适合你。

学习hadoop需要具有javaSE的知识,对jsp/servlet部分没有要求。
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 加入黑马