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 2 0 2
matrix2.txt
0 3 -1 2 -3
1 3 5 -2 -1
0 1 4 -1 2
-2 2 -1 1 2
package com.ghc.hadoop;
import java.io.*;
public class Utils {
public static void main(String[] args){
generateMatrixFromFile("inputs/matrix1.txt","outputs/outmatrix1.txt");
}
public static void generateMatrixFromFile(String src,String target){
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
String outStr = null;
try {
bufferedReader = new BufferedReader(new FileReader(src));
bufferedWriter = new BufferedWriter(new FileWriter(target));
String line = null;
Integer row = 1;
while((line=bufferedReader.readLine())!=null){
String[] columns = line.split(" ");
StringBuilder sb = new StringBuilder();
sb.append(row+"\t");
for(int i=0;i<columns.length;i++){
sb.append((i+1)+"_"+columns[i])
.append(",");
}
outStr = sb.toString();
if(sb.toString().endsWith(",")){
outStr = sb.substring(0,sb.length()-1);
}
bufferedWriter.write(outStr);
bufferedWriter.newLine();
bufferedWriter.flush();
row+=1;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
finally {
if(bufferedReader!=null){
try{bufferedReader.close();}
catch (IOException ioe){
ioe.printStackTrace();
}
}
if(bufferedWriter!=null){
try{bufferedWriter.close();}
catch (IOException ioe){
ioe.printStackTrace();
}
}
}
}
}
利用上面的工具类生成 outmatrix1.txt , outmatrix2.txt 两个文本文件
下面是利用工具类产生的两个文件,会用作 后面 map reduce 的 输入文件
outmatrix1.txt
1 1_1,2_2,3_-2,4_0
2 1_3,2_3,3_4,4_-3
3 1_-2,2_0,3_2,4_3
4 1_5,2_3,3_-1,4_2
5 1_-4,2_2,3_0,4_2
outmatrix2.txt
1 1_0,2_3,3_-1,4_2,5_-3
2 1_1,2_3,3_5,4_-2,5_-1
3 1_0,2_1,3_4,4_-1,5_2
4 1_-2,2_2,3_-1,4_1,5_2
这里稍微介绍下 , 矩阵相乘的原理, 左矩阵的列与右矩阵的行相乘,如上面的两个
左矩阵 shape : 5x4 , 右矩阵 shape: 4x5 ===> out-> shape : 5x5 这里如果有不理解的地方请找到大学的线性代数老师
下面将要对 右矩阵也就是 outmatrix2.txt 里的矩阵 转置 也就是 行列转换下, 因为可能会有多个 map reduce 作业,所以注意下命名 Mapper1 , Reducer1 等等
package com.ghc.hadoop.mapper;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class Mapper1 extends Mapper<LongWritable,Text,Text,Text> {
private Text outKey = new Text();
private Text outValue = new Text();
/**
* key: 1
value: 1 1_0,2_3,3_-1,4_2,5_-3
本类用于转置矩阵
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] rowAndLine = value.toString().split("\t");
// row 为行号
String row = rowAndLine[0];
String lines = rowAndLine[1];
String[] columns = lines.split(",");
// ["1_0","2_3","3_-1","4_2","5_-3"]
for(int i=0;i<columns.length;i++){
String[] columnAndValue = columns[i].split("_");
String column = columnAndValue[0];
String valueStr = columnAndValue[1];
// column 列号 , value: 行号_值
outKey.set(column);
outValue.set(row+"_"+valueStr);
context.write(outKey,outValue);
}
}
}
reduce 操作
package com.ghc.hadoop.reducer;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class Reducer1 extends Reducer<Text,Text,Text,Text>{
private Text outKey = new Text();
private Text outValue = new Text();
@Override
protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
StringBuilder sb = new StringBuilder();
// column 列号 , value: 行号_值
for(Text text:values){
sb.append(text+",");
}
String line = sb.toString();
if(sb.toString().endsWith(",")){
line = sb.toString().substring(0,sb.length());
}
outKey.set(key);
outValue.set(line);
context.write(outKey,outValue);
}
}
推荐算法
待续。。。
java 写一个 map reduce 矩阵相乘的案例的更多相关文章
- 第一个map reduce程序
完成了第一个mapReduce例子,记录一下. 实验环境: hadoop在三台ubuntu机器上部署 开发在window7上进行 hadoop版本2.2.0 下载了hadoop-eclipse-plu ...
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
- 五:用JAVA写一个阿里云VPC Open API调用程序
用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...
- 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载
用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分 Export 2.工具类:TxtFileU ...
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- 使用JAVA写一个简单的日历
JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
- ODPS 下一个map / reduce 准备
阿里接到一个电话说练习和比赛智能二选一, 真的很伤心, 练习之前积极老龄化的权利. 要总结ODPS下一个 写map / reduce 并进行购买预测过程. 首先这里的hadoop输入输出都是表的形式, ...
- 自己动手用java写一个hashMap
入坑java很多年了,现在总结一下自己学到的东西. 1.首先我们先来聊聊什么是HashMap? 什么是hash?hash用中文的说法就叫做“散列”,通俗的讲就是把任意长度的字符串输入,经过hash计算 ...
随机推荐
- 【CF1009F】Dominant Indices(长链剖分)
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的 ...
- 【BZOJ5294】[BJOI2018]二进制(线段树)
[BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...
- docker-网络基础
网络 Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络 Docker 安装时会自动在 host 上创建三个网络, ⚡ root@bogon /home ...
- pycharm 中的 全局搜索(ctrl+shift+f) 功能无法使用的原因
全局搜索的时候Ctrl+Shift+F按键失灵,有的时候可以,有时又不行了,百思不得其解. 在網上搜索很多人說是搜狗输入法的快捷键冲突了,但是我的电脑用的是微软自带的输入法 后来打开微软的输入法设置发 ...
- linux防火墙,高级策略策略实例详解(实例一)
双线服务器的控制问题: 要求:写出这个电信用户访问到双线web服务器时的IP变化过程(只写源IP,目标IP,和做SNAT还是DNAT等) 你觉得有没有问题? 实验环境: 精简一点可以使用下面的四台虚拟 ...
- BZOJ--1045-- 糖果传递(中位数,排序)
题目链接 :BZOJ--1045-- 糖果传递 我们知道如果不头尾相连的话 直接求一个前缀和 答案为ans+=s[i] 不相连的话就是1 和n之间断开 头尾相连的话就是 在第k个人之间断开 设A[i] ...
- Spring Data JPA Batch Insertion
转自:https://www.jeejava.com/spring-data-jpa-batch-insertion/ Spring Data JPA Batch Insertion will sho ...
- java == 与 equals
1.基本数据类型用"==" java的基本数据类型,也称为原始的数据类型.它们分别是: byte, short, char, int, long, float, double, b ...
- 逗号分隔的字符串与List互转
将逗号分隔的字符串转换为List // 将逗号分隔的字符串转换为List String str = "a,b,c"; // 1.使用JDK,逗号分隔的字符串-->数组--&g ...
- [luoguU48574][藏妹子之处]
题目链接 思路 首先,因为这是曼哈顿距离,所以很容易就可以将这三个点之间的距离转化为一个矩形,那么这三个点在矩形上的分布只有六种可能. 假设当前矩形的长为n,宽为m.那么可以发现,无论是哪一种情况,这 ...