矩阵相乘能够查看百度百科的解释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实现矩阵相乘的更多相关文章

  1. Python+MapReduce实现矩阵相乘

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

  2. MapReduce的矩阵相乘

    一.单个mapreduce的实现 转自:http://blog.sina.com.cn/s/blog_62186b460101ai1x.html 王斌_ICTIR老师的<大数据:互联网大规模数据 ...

  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. DNS域欺骗攻击详细教程之Linux篇

    .DNS域欺骗攻击原理 DNS欺骗即域名信息欺骗是最常见的DNS安全问题.当一 个DNS服务器掉入陷阱,使用了来自一个恶意DNS服务器的错误信息,那么该DNS服务器就被欺骗了.DNS欺骗会使那些易受攻 ...

  2. 关于chrome浏览器更新后快捷工具失效的解决方法

    更新chrome浏览器到29.0时发现快捷工具的双击关闭标签页失效了,解决办法: 1.打开chrome的文件夹.C:\Program Files (x86)\Google\Chrome\Applica ...

  3. MyGui笔记(1)建立第一个工程

    记录下学习 MyGui的一些笔记,从建立第一个工程开始. 步骤: 1.右键MYGUI解决方案,添加→新建项目,选择“Win32 项目”,名称为:TestHello.下一步,勾选“空项目”. 2.设置工 ...

  4. Java String.replace()方法

    Java String.replace()方法用法实例教程, 返回一个新的字符串,用newChar替换此字符串中出现的所有oldChar 声明 以下是java.lang.String.replace( ...

  5. Spring、Hello AOP

    AOP 概念:http://blog.csdn.net/moreevan/article/details/11977115 AOP 所使用到的jar 包: aspectjrt.jar common-a ...

  6. 如何使用dynamic

    DataTable dt = new DataTable("TableOne"); dt.Columns.Add("ID", typeof(int));     ...

  7. HashMap 的遍历key与value的方法

    HashMap最经常使用的使用方法是依据key增删改查value,有时候会须要知道一个HashMap有多少个keys以及这些keys都是什么,能够用以下的代码实现. 方法1: Map map = ne ...

  8. 【Sharepoint】CSS与Master Page的开发与部署

    一.CSS的开发与部署相对比较简单,先是要上传CSS文件到样式库中,然后在页面模板中将上传的自定义CSS样式文件设置为所有文件的默认css文件.下面详细的介绍CSS文件的开发与部署过程. 1.编写自定 ...

  9. Angular基础知识

    AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过 ng-directives 扩展了 HTML. ...

  10. OC中的一个特性:延展

    OC中的一个特性:延展其实说白了,延展就是弥补C语言中的前向申明,我们知道,在C语言中,如果你想调用一个函数的话,那么在此之前必须要声明一个这个函数,就是有前置性.OC中为了弥补C语言中的这个问题,就 ...