矩阵乘法在hadoop的实现
先随机生成一个矩阵,矩阵的行数与列数由用户输入:
#!/bin/bash
for i in `seq 1 $1`
do
for j in `seq 1 $2`
do
s=$((RANDOM%100))
echo "s==="$s
echo -e "$i,$j\t$s" >>M_$1_$2
done
done
for i in `seq 1 $2`
do
for j in `seq 1 $3`
do
s=$((RANDOM%100))
echo -e "$i,$j\t$s" >>N_$2_$3
done
done
执行上面的shell脚本,即可生成一个矩阵。矩阵的乘法在hadoop的并行化实现,其基本的实现思路如下:
map:对于矩阵的M的每一个元素mij,产生一系列的key-value对<(i,k),(M,j,mij)>;对于矩阵的N的每个元素Njk,产生一系列的key-value对<(j,k),(N,j,mjk)>;
reduce:对于每个键(i,k)相关联的值(M,j,mij),(N,j,mjk),根据相同的j值将mij和njk分别存入不同的数组中,然后将两者的的第J个元素抽取出来分别相乘,最后相加,即可得到Pik的值。
下面给出hadoop的map和reduce代码的实现。
public static class MatrixMapper extends Mapper<Object,Text,Text,Text>{
private Text map_key=new Text();
private Text map_value=new Text();
public void setup(Context context) throws IOException{
Configuration conf=context.getConfiguration();
columnN=Integer.parseInt(conf.get("columnN"));
rowM=Integer.parseInt(conf.get("rowM"));
}
public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
FileSplit fileSplit=(FileSplit )context.getInputSplit();
String fileName=fileSplit.getPath().getName();
String[] tuple=value.toString().split(",");
if(fileName.startWith("M")){
int i=Integer.parseInt(tuple[0]);
String tuples=tuple[1].split("\t");
int j=Integer.parseInt(tuples[0]);
int Mij=Integer.parseInt(tuples[1]);
for(int k=1;k<columnN+1;k++){
map_key.set(i+","+k);
map_value.set("M"+","+j+","+Mij);
context.write(map_key,map_value);
}
}else if(fileName.startWith("N")){
int j=Integer.parseInt(tuple[0]);
String tuples=tuple[1].split("\t");
int k=Integer.parseInt(tuples[0]);
int Njk=Integer.parseInt(tuples[1]);
for(int i=1;i<rowM+1;i++){
map_key.set(i+","+k);
map_value.set("N"+","+j+","+Njk);
context.write(map_key,map_value);
}
}
}
通过map函数的处理,对每一行数据,根据间隔符进行分割。这样就得到形如<(2,2),(M,3,7)>这种格式的键值对,从而方便在reduce函数相乘。reduce的函数如下:
public static class MatrixReducer extends Reducer<Text,Text,Text,Text>{
private int sum=0;
public void setup(Context context) throws IOException{
Configuration conf=context.getConfiguration();
columnM=Integer.parseInt(conf.get("columnM"));
}
public void reduce(Text,key,Iterable<Text> values,Context context) throws IOException,InterruptedException{
int[] M=new int[columnM+1];
int[] N=new int[columnM+1];
for(Text val:values){
String[] tuple=val.toString().split(",");
if(tuple[0].equals("M")){
M[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);
}else{
N[Integer.parseInt(tuple[1])]=Integer.parseInt(tuple[2]);
}
}
//矩阵乘法
for(int j=1;j<columnM+1;j++){
sum+=M[j]*N[j];
}
context.write(key,new Text(sum));
sum=0;
}
}
矩阵乘法在hadoop的实现的更多相关文章
- 矩阵乘法的MapReduce实现
对于任意矩阵M和N,若矩阵M的列数等于矩阵N的行数,则记M和N的乘积为P=M*N,其中mik 记做矩阵M的第i行和第k列,nkj记做矩阵N的第k行和第j列,则矩阵P中,第i行第j列的元素可表示为公式( ...
- MapReduce实现矩阵乘法
简单回想一下矩阵乘法: 矩阵乘法要求左矩阵的列数与右矩阵的行数相等.m×n的矩阵A,与n×p的矩阵B相乘,结果为m×p的矩阵C.具体内容能够查看:矩阵乘法. 为了方便描写叙述,先进行如果: 矩阵A的行 ...
- 【甘道夫】MapReduce实现矩阵乘法--实现代码
之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...
- MapReduce实现大矩阵乘法
来自:http://blog.csdn.net/xyilu/article/details/9066973 引言 何 为大矩阵?Excel.SPSS,甚至SAS处理不了或者处理起来非常困难,需要设计巧 ...
- *HDU2254 矩阵乘法
奥运 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...
- *HDU 1757 矩阵乘法
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- POJ3070 Fibonacci[矩阵乘法]
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- bzoj 2738 矩阵乘法
其实这题跟矩阵乘法没有任何卵关系,直接整体二分,用二维树状数组维护(刚刚学会>_<),复杂度好像有点爆炸(好像有十几亿不知道是不是算错了),但我们不能怂啊23333. #include&l ...
随机推荐
- mac下远程win8.1时提示"桌面连接无法验证您希望连接的计算机的身份"的解决办法
在os x下使用远程桌面到win8.1,总出现“远程桌面连接无法验证您希望连接的计算机的身份”的提示. 解决方法:1.网上各种解释,包括防火墙是否打开,是否去掉“仅允许运行使用网络级别身份验证的远程计 ...
- 《C#高效编程》读书笔记08-推荐使用查询语法而不是循环
C#语言中并不缺少控制程序流程的结构,for.while.do/while和foreach等都可以做到这一点.但我们还有更好的方式:查询语法(query syntax) 下面这段代码演示了用命令式的方 ...
- 去除pycharm的波浪线
PyCharm使用了较为严格的PEP8的检查规则,如果代码命名不规范,甚至多出的空格都会被波浪线标识出来,导致整个编辑器里铺满了波浪线,右边的滚动条也全是黄色或灰色的标记线,很是影响编辑.这里给大家分 ...
- axios使用配置
axios 配置 下载cnpm install axios vue-axios --save-dev main.js文件中配置 import axios from 'axios' import Vue ...
- 解决perl: warning: Setting locale failed.
在Ubuntu Server 12.04上执行apt-get install命令时,报如下warning 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- 【Oracle】曾经的Oracle学习笔记(8-15)ER图,三大范式,数据库字典,视图,索引,序列
一.数据库建模 二.建表 三.数据库字典 四.DML语句 五.视图 六.索引 七.序列 八.DDL语句 Lesson 8 Overview of Data Modeling and Database ...
- 一篇文章读懂JSON
什么是json? W3C JSON定义修改版: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,并不是 ...
- springMvc-对servletApi的支持以及把后台对象以json方式传到前台
1.对servletApi的支持:request.response以及session.cookie的支持 2.把后台代码以json格式向前台输出: 代码: package com.java.contr ...
- IOS 移除栈顶的控制器
- (IBAction)back2Two:(id)sender { // 移除当前栈顶的控制器 [self.navigationController popViewControllerAnimated ...
- hdu-3371 Connect the Cities---kruskal
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 题目大意: 给n个城市,m条路,k组已知路,求最小费用联通所有城市: 解题思路: kruska ...