這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)mapreduce中怎么實現(xiàn)矩陣相乘,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)株洲,十年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
設(shè),,那么
矩陣乘法要求左矩陣的列數(shù)與右矩陣的行數(shù)相等,的矩陣,與的矩陣相乘,結(jié)果為的矩陣。
現(xiàn)在我們來分析一下,哪些操作是相互獨立的(從而可以進行分布式計算)。很顯然,的計算和的計算是互不干擾的;事實上,中各個元素的計算都是相互獨立的。這樣,我們在Map階段,可以把計算所需要的元素都集中到同一個key中,然后,在Reduce階段就可以從中解析出各個元素來計算;的其他元素的計算同理。
我們還需要注意,會被、……的計算所使用,會被、……的計算所使用。也就是說,在Map階段,當(dāng)我們從HDFS取出一行記錄時,如果該記錄是的元素,則需要存儲成個
經(jīng)過以上分析,整個計算過程設(shè)計為:
(1)在Map階段,把來自表的元素,標(biāo)識成條
于是乎,在Map階段,我們實現(xiàn)了這樣的戰(zhàn)術(shù)目的:通過key,我們把參與計算的數(shù)據(jù)歸為一類。通過value,我們能區(qū)分元素是來自還是,以及具體的位置。
(2)在Shuffle階段,相同key的value會被加入到同一個列表中,形成
(3)在Reduce階段,有兩個問題需要自己問問:
當(dāng)前的
list中的每個value是來自表或表的哪個位置?
第一個問題可以從key中獲知,因為我們在Map階段已經(jīng)將key構(gòu)造為形式。第二個問題,也可以在value中直接讀出,因為我們也在Map階段做了標(biāo)志。
接下來我們所要做的,就是把list(value)解析出來,來自的元素,單獨放在一個數(shù)組中,來自的元素,放在另一個數(shù)組中,然后,我們計算兩個數(shù)組(各自看成一個向量)的點積,即可算出的值。
示例矩陣和相乘的計算過程如下圖所示:
其中map階段:
public static class MatrixMap extends Mapper
reduce階段:
public static class MatrixReduce extends Reducer{ private Map matrix_a; private Map matrix_b; @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { matrix_a = new HashMap (); matrix_b = new HashMap (); for(Text value : values){ //循環(huán)分辨values中值是矩陣a或是b的,并存入map集合a和b中 String line = value.toString(); if(line.startsWith("a,")){ String[] lines = line.split(","); if(lines.length == 3) matrix_a.put(Integer.parseInt(lines[1]), Integer.parseInt(lines[2])); }else{ String[] lines = line.split(","); if(lines.length == 3) matrix_b.put(Integer.parseInt(lines[1]), Integer.parseInt(lines[2])); } } int a_value = 0; int b_value = 0; int result = 0; //分別取出a和b集合中,計算結(jié)果放入result中 for(int i = 1; i <= matrix_j; i++){ if(matrix_a.get(i) != null && matrix_b.get(i) != null){ a_value = matrix_a.get(i); b_value = matrix_b.get(i); result += a_value * b_value; } } context.write(key, new Text(result+"")); } }
主程序:
public static void run(String time, Configuration conf) throws IOException, ClassNotFoundException, InterruptedException{ // 需求輸出文件路徑 String outpath = VALUE_FSNAME+ "/data/test_out/zk/matrix-"+time; // 需求輸入文件路徑 String input1 = VALUE_FSNAME+"/data/test_in/matrix3"; String input2 = VALUE_FSNAME+"/data/test_in/matrix4"; File jarFile = EJob.createTempJar("bin"); @SuppressWarnings("deprecation") Job job = new Job(conf, "Test-Matrix"); job.setJarByClass(TestMatrix1.class); job.setMapperClass(MatrixMap.class); job.setReducerClass(MatrixReduce.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); job.setNumReduceTasks(1); job.setInputFormatClass(TextInputFormat.class); job.setOutputFormatClass(TextOutputFormat.class); FileInputFormat.addInputPaths(job, input1+","+input2);; FileOutputFormat.setOutputPath(job, new Path(outpath)); // 提交job if (job.waitForCompletion(true)) { System.err.println("計算完成!"); } else { System.err.println("error!請檢查程序!"); } }
最后,大家請看一下原始數(shù)據(jù):
matrix1:
1,2,3 4,5,0 7,8,9 10,11,12
matrix2:
10,15 0,2 11,9
上述就是小編為大家分享的mapreduce中怎么實現(xiàn)矩陣相乘了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。