MapReduce实现矩阵乘法
@author:x1nge
- 大数据基础实验
具体分析
1.考虑怎么利用map和reduce来计算矩阵乘法,想到这里的时候我脑子里有成千上万个解法,像map的key和value要怎么输出啊之类的,一时间我不知道哪一种计算方法比较高效,但是经过半节课的深思熟虑以后,我把总体的思路定为:map的key输出空值,value输出行号+本行的值。(这里有个前提,我让写有矩阵的两个文件都添加一个标识符,在第一个文件中的第一行添加:# 2 3 代表左矩阵2行3列,另一个文件则用@标识,如下图:)
2.然后开始写算法,首先写的是map的部分,我发现在整个程序执行过程中我要多次用到两个矩阵的行和列的长度,每次都通过.lenth的方式去计算显得有些不便,于是:
public static String[] row = {
"0","0"}; //标识矩阵的行
public static String[] col = {
"0","0"}; //标识矩阵的列
public static int[] rowNum = {
0,0};
我定义了几个全局变量,以便在任何地方使用这几个量,其中[0]为第一个矩阵[1]为第二个,rowNum为当前处理的行号,然后获取前两个全局变量的值:
//获取文件中的第一行的数据,格式为: # X Y,表示该文件保存的矩阵为X行Y列
if (readLine.contains("#")) {
String[] XY = readLine.split(" ");
row[0] = XY[1];
col[0] = XY[2];
return;
}
if (readLine.contains("@")) {
String[] XY = readLine.split(" ");
row[1] = XY[1];
col[1] = XY[2];
return;
}
3.接下来是常规的处理每一行数据的时候了,这里我要做的就是用split把一行数据中的行号提取出来并且赋值给mapValue,同时行号++以便处理下一行数据:
mapValue = rowNum[0] + " " + readLine;
rowNum[0]++;
mapValue = rowNum[1] + " " + readLine;
rowNum[1]++;
4.至此map阶段完成。
context.write(new Text(mapKey), new Text(mapValue));
5.reduce阶段我要做的就是把我要用到的数据赋值给jz1和jz2,这样方便我通过计算得到我需要的矩阵resultJz:
//给两个等待计算的矩阵赋值
if(getContent.length == (Integer.parseInt(col[0]) + 1)){
getRow = Integer.parseInt(getContent[0]);
for(int i =0;i < Integer.parseInt(col[0]);i++){
jz1[getRow][i] = Integer.parseInt(getContent[i+1]);
}
System.out.println("getRow" + getRow + "a:");
for(int i =0;i < Integer.parseInt(col[0]);i++){
System.out.println(jz1[getRow][i]);
}
count--;
}
if(getContent.length == (Integer.parseInt(col[1]) + 1)){
getRow = Integer.parseInt(getContent[0]);
for(int j =0;j < Integer.parseInt(col[1]);j++){
jz2[getRow][j] = Integer.parseInt(getContent[j+1]);
}
System.out.println("getRow" + getRow + "b:");
for(int j =0;j < Integer.parseInt(col[1]);j++){
System.out.