MapReduce 与函数式编程
来源:互联网 发布:农村知客一般用词 编辑:程序博客网 时间:2024/05/24 03:00
MapReduce 与函数式编程
MapReduce 的抽象受到LIsp和其他函数式语言你中的map和reduce原语的启发。map和reduce(fold)函数都是属于在函数式编程语言中的高阶函数。map函数的功能是接受一个列表list以及一个函数,将这个函数作用于这个列表中的所有成员,并返回所得结果。例如,下述函数将括号中的三个数每个加一:
map(+1)[1,2,3]
这个表达式的输出结果是[2,3,4]
。
而fold函数的功能则是接收一个列表、一个初始值以及一个函数,将该函数作为特定的组合方式,将其递归地应用于列表的所有成员,并返回最终结果,比如,下述函数计算0+1+2+3
的和:
fold(+)0[1,2,3]
其具体的操作流程是(((0+1)+2)+3),并最终返回其总和。同样,也可以用fold求一个列表的所有元素之积:
fold(*)1[1,2,3]
还继续用上面统计单词次数的例子,MapReduce计算模型里的map函数实际上相当于下述函数式编程语言的语句:
map(f)[<k1,v1>,<k2,v2>,<k3,v3>,...]
其中f为用户实现的mapper函数里的操作,所以我们可以看出,它本质上就是函数式编程中的map函数合成的操作。
让我们用Haskell的例子说明reduce函数,其功能就是分别求若干个数组中数字的积:
Prelude> let a=[[1,2,3],[4,5,6],[7,8,9],[10,11,12]]Prelude> map(foldr(*)1)a[6,120,504,1320]
作为类比,可以把MapReduce计算模型里的reduce抽象成下述形式,根据键将键值对分组,然后分别计算:
let Internediate=[[<k1,v1>,<k1,v2>,<k1,v3>...],[<k2,v1>,<k2,v2>,<k2,v3>...]...]map(reduce(f)[])Intermediate
只不过这里,map步骤是由partitioner来实现分发不同键组的动作,而实际上对于每一个reducer来说,它的工作方式正像是函数式编程里的reducer一样,对每一个键值组采用用户写的f作为特定的组合方式。
综上所述,函数式语言与Hadoop这类系统中的map和reduce函数并没有本质区别。作为计算模型而言,MapReduce实际上就是函数式编程语言中的map和reduce函数的并行化拓展。另外,我们可以从MapReduce计算模型身上处处体会到函数式编程的哲学原理,即把数据抽象作为一个流来进行操作,而显然这种抽象也正是并行化的基础。
从抽象的观点看,一个流也就是一个序列。流处理使我们可以模拟一些包含状态的系统,但却不需要利用复制或者变动数据。这一情况会产生一些重要的结果,既有理论的也有实际的。因为我们可以构造出一些模型,它们能避免由于引进赋值而带来的内在缺陷。但是,流框架也造成了它自己的困难。
- MapReduce 与函数式编程
- Java函数式编程(九)MapReduce
- mapreduce填空式编程
- 5. MapReduce 结构与wordcount编程案例
- JavaScript与函数式编程
- JavaScript与函数式编程
- 函数式编程与 C++
- 函数式编程与Scala
- DSL与函数式编程
- 命令式编程与函数式编程
- 命令式编程与函数式编程
- 链式编程与函数式编程
- iOS 链式编程与函数式编程
- Python:函数式编程与函数
- python lambda函数 与 函数式编程
- 函数式编程与高阶函数
- 知识点四:函数与函数式编程
- Python函数与函数式编程
- 初次运行 Git 前的配置
- 8460
- 平衡树:treap学习笔记(3)
- 如何改变企业高管的数字转型理念
- 经典面试问题引发的一些想法
- MapReduce 与函数式编程
- 机器学习阶梯下降多类问题解析及编码
- 阿里云学生服务器搭建网站(1)-购买阿里云学生服务器
- 14、使用Nginx+Tomcats搭建高可用负载均衡集群
- Angular2学习笔记——NgModule
- Nginx代理Location指令
- 技嘉主板配ubuntu出现黑屏的解决办法
- C++的多态性
- 在linux下怎么安装.bin文件