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 ...
随机推荐
- FileProvider是个什么东西?
FileProvider是个什么东西? 在<读取并监控文件的变化>中,我们通过三个简单的实例演示从编程的角度对文件系统做了初步的体验,接下来我们继续从设计的角度来继续认识它.这个抽象的文件 ...
- undo_retention:确定最优的撤销保留时间
使用下面的公式来计算undo_retention参数的值: undo_retention=undo size/(db_block_size * undo_block_per_sec) 可以通过提交下面 ...
- Object.prototype.toString.call() 区分对象类型(判断对象类型)
在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种.对于数组. ...
- 【Daily】 2014-4-28
KEEP GOING 表达产品想法, 探讨产品问题, 倾听可能性问题. 一次就做好, 有成果展示, 主动展示 先确立图, 后确立代码. Hold dream, and never let it go ...
- Unity3d GUI弹窗
ArrayList w_position = new ArrayList(); void OnGUI() { if (GUILayout.Button("Open")) { if ...
- mysql 存储过程 动态sql例子
proc:BEGIN ; ; ; ) DEFAULT ''; ) DEFAULT ''; ) DEFAULT '';#插入日志的表,一个活动一张表 #将局部变量转换成会话变量 #动态sql语言只接受会 ...
- 成都UBER优步司机第六组奖励政策
保底时段详解 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs. ...
- Linux网络设备驱动架構學習(三)
Linux网络设备驱动架構學習(三) 接下來會從以下幾個方面介紹網絡設備驅動的編寫流程: 1.網絡設備的註冊與註銷 2.網絡設備的初始化 3.網絡設備的打開與釋放 4.網絡數據發送流程 5.網絡數據接 ...
- SVN 权限配置具体说明
svnserve权限配置 分配权限时.文件夹应该应该遵从从大到小,权限应该从小到大的规则 即:文件夹从根文件夹開始,权限从没有权限(为空就可以)到可写再到可读写. 提示:文件夹的訪问权限既能够分配给组 ...
- C# GridView弹出窗口新增行 删除行
<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" ...