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 矩阵相乘的案例的更多相关文章

  1. 第一个map reduce程序

    完成了第一个mapReduce例子,记录一下. 实验环境: hadoop在三台ubuntu机器上部署 开发在window7上进行 hadoop版本2.2.0 下载了hadoop-eclipse-plu ...

  2. 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  3. 五:用JAVA写一个阿里云VPC Open API调用程序

    用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...

  4. 用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载

    用java写一个servlet,可以将放在tomcat项目根目录下的文件进行下载,将一个完整的项目进行展示,主要有以下几个部分: 1.servlet部分   Export 2.工具类:TxtFileU ...

  5. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  6. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  7. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  8. ODPS 下一个map / reduce 准备

    阿里接到一个电话说练习和比赛智能二选一, 真的很伤心, 练习之前积极老龄化的权利. 要总结ODPS下一个 写map / reduce 并进行购买预测过程. 首先这里的hadoop输入输出都是表的形式, ...

  9. 自己动手用java写一个hashMap

    入坑java很多年了,现在总结一下自己学到的东西. 1.首先我们先来聊聊什么是HashMap? 什么是hash?hash用中文的说法就叫做“散列”,通俗的讲就是把任意长度的字符串输入,经过hash计算 ...

随机推荐

  1. 微信小程序避坑指南

    如果对小程序还不熟悉,建议先看下另一篇小程序简介 1. 基础库和微信版本对应关系 iOS 客户端版本 基础库版本 6.7.2 2.3.0 6.7.0 2.2.5 6.6.7 2.1.3 6.6.6 2 ...

  2. 【CF1097E】Egor and an RPG game(动态规划,贪心)

    [CF1097E]Egor and an RPG game(动态规划,贪心) 题面 洛谷 CodeForces 给定一个长度为\(n\)的排列\(a\),定义\(f(n)\)为将一个任意一个长度为\( ...

  3. 【BZOJ5294】[BJOI2018]二进制(线段树)

    [BZOJ5294][BJOI2018]二进制(线段树) 题面 BZOJ 洛谷 题解 二进制串在模\(3\)意义下,每一位代表的余数显然是\(121212\)这样子交替出现的. 其实换种方法看,就是\ ...

  4. 【Linux】Linux系统硬链接和软链接

    在linux系统中有种文件是链接文件,可以为解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link). 查看lin ...

  5. hdu 3746 Cyclic Nacklace(kmp最小循环节)

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

  6. BZOJ 1143: [CTSC2008]祭祀river(最大独立集)

    题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1143 一句话题意:给一个DAG(有向无环图),求选出尽量多的点使这些点两两不可达,输出点个 ...

  7. Docker安装及常用命令

    修改机器名: [root@docker /]# hostnamectl set-hostname Docker 安装EPEL源: [root@docker /]# yum -y install epe ...

  8. Vim auto-pairs设置选项

    let g:AutoPairs = {'(':')', '[':']', '{':'}',"'":"'",'"':'"'} 设置要自动配对的 ...

  9. Neovim中提示Error: Required vim compiled with +python

    Neovim在编辑python文件时出现错误提示,如下图 原因 出现该错误的原因说明未安装Python2/3的支持 解决方法 使用包管理器安装Neovim的Python支持python-neovim ...

  10. struts2 contextMap

    一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...