参考斯坦福大学的数据挖掘教材《 M i n i n g o f M a s s i v e D a t a s e t s Mining \ of \ Massive \ Datasets Mining of Massive Datasets》,里面介绍了以下一些 M a p R e d u c e MapReduce MapReduce算法的应用
矩阵-向量乘积
假设我们有一个 n ∗ n n * n n∗n的矩阵 M M M,它第 i i i行第 j j j列的元素我们称为 m i j m_{ij} mij,同时我们有一个 n n n维向量 v v v。那么他们的乘积我们可以记作 X X X,其中 x i = ∑ j = 1 n m i j v j x_i=\sum_{j=1}^nm_{ij}v_j xi=∑j=1nmijvj。当 n n n比较小时,我们并不会用到 M a p R e d u c e MapReduce MapReduce,当矩阵的维度大到机器的主存都放不下的时候,我们就需要 M a p R e d u c e MapReduce MapReduce出手相助了。
Map Tasks
我们假设主存能够放下矩阵的一行和被乘向量 v v v(其实这是理所当然的,还没听说过哪一个数据的维度让32GB的主存都放不下),那么,我们的map就可以向reduce机器输出 ( i , m i j v j ) (i, m_{ij}v_j) (i,mijvj)的键值对(根据前面 x i = ∑ j = 1 n m i j v j x_i=\sum_{j=1}^nm_{ij}v_j xi=∑j=1nmijvj设计)
Reduce Tasks
我们根据键值 i i i把所有 m i j v j m_{ij}v_j mijvj进行求和,输出 ( i , x i ) (i, x_i) (i,xi)即可。
万一…
万一真的有数据让主存存下矩阵一行后,无法存下完整的向量 v v v该怎么办呢?这时候,我们就可以把矩阵和向量拆分成更小的块,然后设计编号,再求和就行了。具体细节就不展开了。
关系代数
学过数据库的小伙伴们应该知道,数据库里有一种很常见的那就是关系型数据库。这是一种建立在关系代数运算基础上的数据库。我们知道,数据库存储的数据通常是相当庞大的,那么数据库进行的关系运算常常也会需要用到 M a p R e d u c e MapReduce MapReduce。
选择运算
选择运算就是选择出符合关系表达式的数据。比如, σ A = ′ b ′ \sigma_{A='b'} σA=′b′表达的意思就是选择出在属性 A A A上值为 b b b的元组。那么这个应该如何做呢?其实很简单
Map Tasks
map阶段,根据条件 A = ′ b ′ A='b' A=′b′筛选出符合关系的元组 t t t,生成键值对 ( t , t ) (t, t) (t,t)
Reduce Tasks
把map送来的结果直接输出就好。
并不是多此一举!!!前文有提到,这样能并行运算提高效率。
投影运算
投影运算,就是把一整张表的指定属性列取出来,并做去重。比如 π s \pi_s πs,假定 S S S属性里面有[1, 1, 2, 3 ,4],那么投影的结果就是[1, 2, 3, 4]。
Map Tasks
还是对属性里存在的元组输出键值对 ( t 1 , t 1 ) (t^1, t^1) (t1,t1), t 1 t^1 t1表示在属性列上的投影元组,与整个元组 t t t区分开。
Reduce Tasks
对Map发来的键值对分组,每组变成 ( t 1 , [ t 1 , t 1 . . . ] ) (t^1, [t^1, t^1...]) (t1,[t1,t1...]),在这之后,对存在的组别,输出 t 1 t^1 t1即可。
并集,交集,差集运算
这几个运算比较简单,讲一下大致的思路。假设我们要求若干个集合的交并差,Map阶段可以输出 ( t , i d x ) (t, idx) (t,idx),即元组加上集合编号。Reduce阶段对键进行组合后,得到若干 ( t , [ 1 , 2 ] ) (t, [1, 2]) (t,[1,2]) ( t , [ 2 , 4 ] ) (t, [2, 4]) (t,[2,4])这种的元组。如果取并集,我们就挑选全部的元组输出,取交则挑选第二项包含全部序号的元组输出,取差则是挑选第二项只包含被减集合序号的元组输出。
自然连接运算
自然连接就是把两张表 R R R和 S S S在他们公共的属性组上进行等值连接。
Map Tasks
我们假定公共属性集为 B B B,关系 R ( A , B ) R(A, B) R(A,B), 关系 S ( B , C ) S(B, C) S(B,C),在Map阶段,我们模仿交并运算的思路,可以输出 ( b , ( R , a ) ) (b, (R, a)) (b,(R,a)), ( b , ( S , c ) ) (b, (S, c)) (b,(S,c))这样的键值对
Reduce Tasks
我们按找键值整理,挑选 ( b , [ ( R , a ) , ( S , c ) ] ) (b, [(R, a), (S, c)]) (b,[(R,a),(S,c)])这样的组别进行连接输出即可
聚集统计运算
同样的,怎么利用MapReduce求最大值,最小值和平均值呢?我们留给读者自行思考。