前面已對hadoop的MapReduce有了個大概認識,下面在看一下hbase中的MapReduce,TableMapper是繼承Hadoop中的Mapper類的,TableReducer是繼承Hadoop中的Reducer類的,詳見hbase官網API詳細說明。
java.lang.Object org.apache.hadoop.mapreduce.Mapper<ImmutableBytesWritable,Result,KEYOUT,VALUEOUT> org.apache.hadoop.hbase.mapreduce.TableMapper<KEYOUT,VALUEOUT>
從上面可以看出,TableMapper中的兩個參數是輸出參數,在main函數中的initTableMapperJob函數中mapper參數後面的兩個參數就是和TableMapper中的兩個參數對應的,輸出參數keyout和valueout是可以自訂的。在TableMapper函數中,如果要實現Map應用,那就要用到父類的map函數,而從繼承關係來看,map方法中的keyin和valuein應該分別對應ImmutableBytesWritable類型和Result類型,這是固定的,這個是和hadoop中的MapReduce參數的區別之處,hadoop中的MapReduce輸入和輸出參數都可以自訂,而map方法中的最後一個參數context,在最後寫入輸出時context.write(keyout,valueout),要與TableMapper中定義的兩個輸出參數對應
java.lang.Object org.apache.hadoop.mapreduce.Reducer<KEYIN,VALUEIN,KEYOUT,org.apache.hadoop.io.Writable> org.apache.hadoop.hbase.mapreduce.TableReducer<KEYIN,VALUEIN,KEYOUT>
TableReducer中的參數keyin和valuein類型分別對應TableMapper中的輸出keyout和valueout類型,如果要實現Reduce應用,那就要用到父類的Reducer函數,這個函數中的三個參數依次是keyin,valuein,context,keyin和valuein分別對應TableReducer中的前兩個參數KEYIN和VALUEIN,TableReducer中的第三個參數可以自訂類型,與context.write參數中的key對應,而context中的value類型必須是Writable類型才行。 下面有三篇關於hbase建表查詢的例子,結合參考資料,自己實現了一個計算平均分的MapReduce的程式
參考資料1 參考資料2 參考資料3
因為只是在現有例子上的一個小改動,只說一下實現思路,代碼就不貼出來了,大家也可以結合上面的例子,寫一個自己的例子練練手。參考資料3中有建scores表的代碼,表結構rowkey是人名,列簇grade和cource,course下有列名math和art,建表結果如下:
name grad course:math course:art
Tom 1 87 97
Jerry 2 100 80
如果要按人名來算平均分,則在map過程中,將row作為key輸出即作為reduce的keyin輸入,將分數作為value輸出,取分數需要遍曆result,因為是兩列,這樣在reduce過程中,就可以按key累加分數,求出按人名統計分數的平均值;如果要按科目來算平均分,則在map過程中,遍曆每行記錄result,取出列名作為key輸出,同時取出列名的value作為value輸出,這樣在reduce過程中,就可以按key累加,求出按科目的平均值