原创

MapReduce 基础算法【矩阵乘法】

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38386316/article/details/81701286

1. 矩阵乘法原理和实现思路

对于任意矩阵MN,若矩阵M的列数等于矩阵N的行数,则记MN的乘积P=MN。其中mij记作矩阵M的第i行第j列的元素,njk记作矩阵N的第j行第k列的元素,则其乘积矩阵P的元素可由下式求得:

pik=(MN)ik=jmijnjk

可以得出,决定最后pik位置的是i,k,所以可以将其作为Reducer的输入key值。而为了求出mijnjk,我们需要分别知道mijnjk。对于mij,其所需要的属性有矩阵名称M,所在行数i,所在列数j,和其本身的数值大小mij;同样对于njk,其所需要的属性有矩阵名称N,所在行数j,所在列数k,和其本身的数值大小njk。这些属性值由Mapper处理得到,基本处理思路下:
Map函数:对于矩阵M中的每个元素mij,产生一系列的keyvalue<(i,k),(M,j,mij)>,其中k=1,2....直到矩阵N的总列数;对于矩阵N中的每个元素njk,产生一系列的keyvalue<(i,k),(N,j,njk)>,其中i=1,2...直到矩阵M的总行数。
Reduce函数:对于每个键(i,k)相关联的值(M,j,mij)(N,j,njk),根据相同的j值将mijnjk分别存入不同数组中,然后将两者的第j个元素抽取出来分别相乘,最后相加,即可得到pik的值。
示例:

设矩阵M[12],矩阵N[213024],其中,i=1,j=1,2,k=1,2,3.经过map()函数之后得到如下的输出。

<(1,1),(M,1,m11)><(1,1),(N,1,n11)><(1,1),(M,2,m12)><(1,1),(N,2,n21)><(1,2),(M,1,m11)><(1,2),(N,1,n12)><(1,2),(M,2,m12)><(1,2),(N,2,n22)><(1,3),(M,1,m11)><(1,3),(N,1,n13)><(1,3),(M,1,m12)><(1,3),(N,1,n23)>

Reduce 函数对于输入的每个key(i,k),根据j值进行抽取出对