MapReduce实现矩阵相乘
矩阵相乘能够查看百度百科的解释http://baike.baidu.com/view/2455255.htm?fr=aladdin
有a和b两个矩阵
a: 1 2 3
4 5 0
7 8 9
10 11 12
b: 10 15
0 2
11 9
c = a*b
1:将矩阵存到HDFS中:
矩阵a:
| 行 | 列 | 值 | hdfs存储 |
| 1 | 1 | 1 | 1,1,1 |
| 1 | 2 | 2 | 1,2,2 |
| 1 | 3 | 3 | 1,3,3 |
| 2 | 1 | 4 | 2,1,4 |
| 2 | 2 | 5 | 2,2,5 |
| 2 | 3 | 0 | 0不存储 |
| 3 | 1 | 7 | 3,1,7 |
| 3 | 2 | 8 | 3,2,8 |
| 3 | 3 | 9 | 3,3,9 |
| 4 | 1 | 10 | 4,1,10 |
| 4 | 2 | 11 | 4,2,11 |
| 4 | 3 | 12 | 4,3,12 |
矩阵b:
| 行 | 列 | 值 | hdfs存储 |
| 1 | 1 | 10 | 1,1,10 |
| 1 | 2 | 15 | 1,2,15 |
| 2 | 1 | 0 | 0不存储 |
| 2 | 2 | 2 | 2,2,2 |
| 3 | 1 | 11 | 3,1,11 |
| 3 | 2 | 9 | 3,2,9 |
2:a的map读取
读取第一个值是1,1,1。它是矩阵a的第一行第一列。那么它要在计算c(1,1) c(1,2)的时候使用(这里c仅仅用2列,假设用n列,那么它的值要在计算c(1,1),c(1,2),c(1,3)...c(1,n)的时候使用)。我们就以 key = 1,1 value = a,1,1 , key= 1,2 value = a,1,1输出两条数据(1,1) (1,2)是 c(1,1) ,c(1,2)的坐标。
b的map读取
读取第一个值是1,1,10。它是矩阵b的第一行第一列。那么它要在计算c(1,1) c(2,1) c(3,1) c(4,1)的时候使用(这里c仅仅用4行,假设用m行,那么它的值要在计算c(1,1),c(2,1),c(3,1)...c(m,1)的时候使用)。我们就以 key = 1,1 value = b,1,10 , key= 2,1 value = b,1,10 , key = 3,1 value = b,1,10 ,
key= 4,1 value = b,1,10输出
3:reduce读取计算
通过mapA和mapB的输出能够得到 key = 1,1 , value=a,1,1 value=b,1,10 value=a,2,2 value=a,3,3 value = b,3,11l来计算c(1,1)的值
代码例如以下:
package MyMatrix; import java.io.IOException;
import java.util.Iterator; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.MultipleInputs;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class MartrixMultiply{ /**
* 最后得到的矩阵的列数
*/
public static final int COL_COUNT = 2; /**
* 最后得到的矩阵的行数
*/
public static final int ROW_COUNT = 4; /**
* A矩阵的列数或者是B矩阵的行数
*/
public static final int BROW_ACOL= 3; public static class MartrixMaperA extends Mapper<LongWritable, Text, Text, Text>{ @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { String valueStr = value.toString();
String[] items = valueStr.split(","); int rowIndex = Integer.parseInt(items[0]);
int colIndex = Integer.parseInt(items[1]);
int valueInt = Integer.parseInt(items[2]); Text outKey = null;
Text outValue = null;
for(int i=0;i<COL_COUNT;i++){
outKey = new Text(rowIndex + "," + (i+1));
outValue = new Text("a,"+colIndex+","+valueInt);
context.write(outKey, outValue);
} } } public static class MartrixMaperB extends Mapper<LongWritable, Text, Text, Text>{ @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { String valueStr = value.toString();
String[] items = valueStr.split(","); int rowIndex = Integer.parseInt(items[0]);
int colIndex = Integer.parseInt(items[1]);
int valueInt = Integer.parseInt(items[2]); Text outKey = null;
Text outValue = null;
for(int i=0;i<ROW_COUNT;i++){
outKey = new Text((i+1) + "," + colIndex);
outValue = new Text("b,"+rowIndex+","+valueInt);
context.write(outKey, outValue);
} } } public static class MartrixReducer extends Reducer<Text,Text,Text,IntWritable>{ @Override
protected void reduce(Text key, Iterable<Text> values,Context context)
throws IOException, InterruptedException { String[] items = new String[3]; int[] valueA = new int[BROW_ACOL];
int[] valueB = new int[BROW_ACOL]; Iterator<Text> it = values.iterator();
while(it.hasNext()){
items = it.next().toString().split(",");
if(items[0].equals("a")){
valueA[Integer.parseInt(items[1])-1] = Integer.parseInt(items[2]);
}else if(items[0].equals("b")){
valueB[Integer.parseInt(items[1])-1] = Integer.parseInt(items[2]);
}
} int result = 0;
for(int i=0;i<BROW_ACOL;i++){
result += valueA[i]*valueB[i];
}
context.write(key, new IntWritable(result));
} } @SuppressWarnings("deprecation")
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Path pathA = new Path("hdfs://localhost:9000/Martrix/a.txt");
Path pathB = new Path("hdfs://localhost:9000/Martrix/b.txt");
Path pathOut = new Path("hdfs://localhost:9000/Martrix/out"); Configuration conf = new Configuration();
Job job = new Job(conf,"MartrixMultiply"); job.setJarByClass(MartrixMultiply.class); MultipleInputs.addInputPath(job, pathA, TextInputFormat.class, MartrixMaperA.class);
MultipleInputs.addInputPath(job, pathB, TextInputFormat.class, MartrixMaperB.class); job.setReducerClass(MartrixReducer.class); job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(Text.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); FileOutputFormat.setOutputPath(job, pathOut); if(job.waitForCompletion(true)){
System.exit(0);
}else{
System.exit(1);
} } }
MapReduce实现矩阵相乘的更多相关文章
- Python+MapReduce实现矩阵相乘
算法原理 map阶段 在map阶段,需要做的是进行数据准备.把来自矩阵A的元素aij,标识成p条<key, value>的形式,key="i,k",(其中k=1,2,. ...
- MapReduce的矩阵相乘
一.单个mapreduce的实现 转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html 王斌_ICTIR老师的<大数据:互联网大规模数据 ...
- python版 mapreduce 矩阵相乘
参考张老师的mapreduce 矩阵相乘. 转载请注明:来自chybot的学习笔记http://i.cnblogs.com/EditPosts.aspx?postid=4541939 下面是我用pyt ...
- 利用Hadoop实现超大矩阵相乘之我见(二)
前文 在<利用Hadoop实现超大矩阵相乘之我见(一)>中我们所介绍的方法有着“计算过程中文件占用存储空间大”这个缺陷,本文中我们着重解决这个问题. 矩阵相乘计算思想 传统的矩阵相乘方法为 ...
- 利用Hadoop实现超大矩阵相乘之我见(一)
前记 最近,公司一位挺优秀的总务离职,欢送宴上,她对我说“你是一位挺优秀的程序员”,刚说完,立马道歉说“对不起,我说你是程序员是不是侮辱你了?”我挺诧异,程序员现在是很低端,很被人瞧不起的工作吗?或许 ...
- 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 ...
- HDU1575Tr A(矩阵相乘与快速幂)
Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...
- POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)
题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...
随机推荐
- liunx下NetworkManager导致网卡不能启动
前几天在客户现场,配置一台系统为redhat 6.0的服务器,这台服务器是IBM x3755,系统是预装的.在把服务器的IP地址配置完成后,使用命令不能启动网卡.提示:弹出界面 eht0:错误:激活链 ...
- Spring、Bean的生命周期
1.默认情况下,在Bean容器被实例化的时候,bean对象将被创建: public class PersonServiceImpl implements PersonIService { public ...
- 网易云课堂_程序设计入门-C语言_第二周:判断_1时间换算
1 时间换算(5分) 题目内容: UTC是世界协调时,BJT是北京时间,UTC时间相当于BJT减去8.现在,你的程序要读入一个整数,表示BJT的时和分.整数的个位和十位表示分,百位和千位表示小时.如果 ...
- Oracle 经常使用命令小结
1.当前数据库中查看建表语句 select dbms_metadata.get_ddl('TABLE','表名') from dual; 2.当前数据库中查看视图创建Sql select text f ...
- cocoa pods出现的错误
ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /usr/bin/pod 解决办法: sudo gem ...
- Nutch2.3分布执行过程中Mongodb中数据的变化
inject $ nutch inject /opt/nutch/runtime/local/urls/ > db.stats() { "db" : "nutch& ...
- vb.net常用函数
当然,这些都可以从MSDN查到,但是有时候打开帮助老慢的,所以先放到这里放一放,查个函数什么的比较快一点.都是从网上搜来的.Abs(number) 取得数值的绝对值. Asc(String) 取得字符 ...
- JSON、XML 解析
iOS开发--XML/JSON数据解析 不错的文章http://www.jianshu.com/p/a54d367adb2a
- 最近做OpenWrt的总结
用到了哪些东西 需要在OpenWrt上开发一个客户端,用C语言写还比较方便,最开始在linux上跑,后面移植到路由器上,做成ipk.除了稍微修改了下Makefile,其他的什么都没改. 因为需要做个配 ...
- U3D学习使用笔记(四)
1.Unity3D项目实战笔记(5):延时功能的几种实现 http://www.xifarm.com/invoke/ 2.动画运行出屏幕范围时消失 Animation CullingType 3.No ...