一、单个mapreduce的实现

转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html

王斌_ICTIR老师的《大数据:互联网大规模数据挖掘与分布式处理》,下面是对第二章提到的的单轮计算矩阵乘法进行的学习实现过程。

矩阵的乘法只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为i×r矩阵,B为r×j矩阵,则他们的乘积AB(有时记做A · B)会是一个i×j矩阵。其乘积矩阵的元素如下面式子得出:

书中提到的对矩阵乘法的MapReduce实现方法是:

Map函数:对于矩阵M的每个元素M[i,j],产生一系列的键值对(i,k)->(M,j, M[i,j]),其中k=1,2…,直到矩阵N的列数。同样,对于矩阵N的每个元素N[j,k],产生一系列的键值对(i,k)->(N,j,N[j,k]),其中i=1,2…,直到矩阵M的行数。

Reduce函数:根据MR的原理,相同键i,k的数据会发送个同一个 reduce。如果M为2*2矩阵,N为2×3矩阵,reduce函数需要处理的数据为:

(1,1)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,1])、(N,2, N[2,1])],

(1,2)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,2])、(N,2, N[2,2])],

(1,3)->[(M,1, M[1,1])、(M,2, M[1,2])、(N,1, N[1,3])、(N,2, N[2,3])],

(2,1)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,1])、(N,2, N[2,1])],

(2,2)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,2])、(N,2, N[2,2])],

(2,3)->[(M,1, M[2,1])、(M,2, M[2,2])、(N,1, N[1,3])、(N,2, N[2,3])]。

这样只要将所有(M,j, M[i,j])和(N,j, N[j,k])分别按照j值排序并放在不同的两个列表里面。将这个列表的第j个元素M[i,j]个N[j,k]相乘,然后将这些积相加,最后积的和与键(i,k)组对作为reduce函数的输出。对于上面的例子reduce的输出就是:

(1,1)->(M[1,1]* N[1,1]+ M[1,2]* N[2,1])

(1,2)->(M[1,1]* N[1,2]+ M[1,2]* N[2,2])

(1,3)->(M[1,1]* N[1,3]+ M[1,2]* N[2,3])

(2,1)->(M[2,1]* N[2,1]+ M[2,2]* N[2,1])

(2,2)->(M[2,1]* N[1,2]+ M[2,2]* N[2,2])

(2,3)->(M[2,1]* N[1,3]+ M[2,2]* N[2,3])

下面是MapReduce的实现步骤:

(1).构造矩阵M:300*150;矩阵N:150*500。两矩阵的值放入HDFS的文件中,每行的格式为:文件标识#行坐标#列坐标#坐标值。

  (2).基于上面的方法编写Map函数和Reduce函数。

http://f.dataguru.cn/thread-133912-1-1.html(也有提到)

二、两次mapreduce

转自:http://f.dataguru.cn/forum.php?mod=viewthread&tid=37927

矩阵相乘:
i*k阶的矩阵M与k*j阶的矩阵N相乘得到到i*j阶的矩阵Q
使用两次map-reduce方法实现矩阵相乘。
第一次mapreduce实现:
对于左矩阵M:
map过程:<(i,k,M),value> ==> <k,(i,value,M)>
map的InputKey为自定义对象,含有三个属性,分别是行号i,列号k,及其矩阵标识号M,
InputValue为矩阵M的i,k的值;
map的OutputKey为列号k,
OutputValue为自定义的对象,含有三个属性:分别是行号i,矩阵标识号M及其值value。

右矩阵N:
map过程:<(k,j,N),value> ==> <k,(j,value,N)>
map的InputKey为自定义对象,含有三个属性,分别是行号k,列号j,及其矩阵标识号N,
InputValue为矩阵M的k,j的值;
map的OutputKey为行号k,
OutputValue为自定义的对象,含有三个属性:分别是列号j,矩阵标识号N及其值value。

reduce的过程:
<k,(i0,value1,M)>
<k,(i1,value2,M)>
......
<k,(j0,value,N)>
<k,(j1,value,N)>
.....
上述作为:reducer的InputKey和InputValue
OutputKey为k,OutputValue为:(i0,value,M),(i1,value,M)......(j0,value,N),(j1,value,N)......列表。

第二次mapreduce实现:
map的过程:
InputKey:k;OutputKey:(i0,value,M),(i1,value,M)......(j0,value,N),(j1,value,N)......
(i0,value,M),(i1,value,M)......与(j0,value,N),(j1,value,N)......进行笛卡尔乘积,计算的结果:
(i0,j0,value*value),(i0,j1,value*value),(i1,j0,value*value),(i1,j1,value*value)......
map的输出结果为:<(i,j),value>

reducer的过程:
输入为:<(i,j),value>
输出结果为:相同的(i,j)将值相加即可,输出为的<(i,j),sum(value)>.
这样的话:M(i,k) * N(k,j) = Q(i,k).

有空写一下代码~

MapReduce的矩阵相乘的更多相关文章

  1. MapReduce实现矩阵相乘

    矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin 有a和b两个矩阵 a:                1   2   ...

  2. Python+MapReduce实现矩阵相乘

    算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...

  3. python版 mapreduce 矩阵相乘

    参考张老师的mapreduce 矩阵相乘. 转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939 下面是我用pyt ...

  4. 利用Hadoop实现超大矩阵相乘之我见(二)

    前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...

  5. 利用Hadoop实现超大矩阵相乘之我见(一)

    前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...

  6. java 写一个 map reduce 矩阵相乘的案例

    1.写一个工具类用来生成 map reduce 实验 所需 input 文件 下面两个是原始文件 matrix1.txt 1 2 -2 0 3 3 4 -3 -2 0 2 3 5 3 -1 2 -4 ...

  7. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  8. <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>

    //矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...

  9. POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)

    题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...

随机推荐

  1. ubuntu+ngnix+thinkphp pathinfo配置

    一.thinkphp 项目改为pathinfo模式 XXX/ThinkPHP/Conf/convention.php文件中找到 'URL_MODEL' => 1, // URL访问模式,可选参数 ...

  2. 【C++】朝花夕拾——中缀转后缀

    对于简单的四则运算而言,后缀表达式可以通过使用栈(stack)快速算出结果 ==================================我是分割线======================= ...

  3. eclipse 新建 maven 项目 + 消除错误

    安装eclips以及maven自行去了解,这里不讲解 一.新建一个 maven 项目. 二.下一步选择项目架构 三.填写相关信息 group id: 一般都是 com点 项目名 aftriact.id ...

  4. 【汇总】java中数组的声明、初始化及遍历

    java中数组用来存储固定大小的同类型元素 一维数组: 1.数组的声明: //声明一维数组,推荐用第一种 int[] a; int b[]; 2.数据的初始化:有三种初始化方式 (1).静态初始化 / ...

  5. Oracle 常用目录结构(10g)

    大多数情况下,了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率,本文介绍了Oracle 10g 的常用目录. OFA: 下面给出Oracle 最优灵活体系结构OFA(Optimal ...

  6. 嵌入式LinuxC语言程序设计基础教程

    第1章 嵌入式LinxuC语言开发工具 第2章 数据 第3章 数据的输入输出 第4章 运算符和表达式 第5章 程序结构和控制语句 第6章 数组 第7章 指针 第8章 函数 第9章 用户自定义数据类型 ...

  7. openstack windows2012r2 glance镜像制作

    镜像实现: 密码注入 修改密码 根分区扩展 1.下载windows iso镜像 下载地址:http://imsdn.com/MSDN-1.html 例如:cn_windows_server_2012_ ...

  8. Leetcode 135.分糖果

    分发糖果 老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果. 相邻的孩 ...

  9. java 日历计算农历和节假日的工具类

    背景 业务需求需要后端提供这样的接口,网上找了很多java代码例子,虽然功能实现了 但是不完善,特别是节日那一块儿.然后百度发现有这样的插件,但是信息也是java后端提供的非js 然后在开源js插件找 ...

  10. HDU 1274 递归拼接字符串

    题目大意: 根据所给的数字,表示其相连的字符的输出个数,或是下一个括号中的所有字符的输出个数 每一个相互对应的 '(' 和 ')' 中的所有字母均作为一组数据处理 在每一次dfs过程中都处理好这样一个 ...