大数据MapReduce实例:实现矩阵乘法

MapReduce实现矩阵乘法

@author:x1nge

  • 大数据基础实验

具体分析

1.考虑怎么利用map和reduce来计算矩阵乘法,想到这里的时候我脑子里有成千上万个解法,像map的key和value要怎么输出啊之类的,一时间我不知道哪一种计算方法比较高效,但是经过半节课的深思熟虑以后,我把总体的思路定为:map的key输出空值,value输出行号+本行的值。(这里有个前提,我让写有矩阵的两个文件都添加一个标识符,在第一个文件中的第一行添加:# 2 3 代表左矩阵2行3列,另一个文件则用@标识,如下图:)
p1
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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x1Nge.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值