預設情況下,map輸出的結果會對key進行預設的排序,但個別需求要求對key排序的同時還需要對value進行排序
這時候就要用到二次排序了。
本章以hadoop權威指南中計算每年最大氣溫值為例,原始資料雜亂無章
2008 33
2008 23
2008 43
2008 24
2008 25
2008 33
2008 13
2008 22
2008 33
2008 33
2009 23
2009 43
2009 24
2009 25
2009 33
2007 15
2007 22
2007 30
2007 100
1.定義組合key
將key和value組合形成新的key(newkey), newkey要實現writablecomparable介面
我這邊定義了乙個新類pairtemp.class,含有year(年份)和temp(氣溫)這兩個字段
必須實現下面3個方法
compareto:排序 (年份公升序,氣溫降序)
write:序列化
readfields:反序列化
序列化和反序列化的順序必須一致
public class pairtemp implements writablecomparable
public pairtemp(int year, int temp)
public int getyear()
public void setyear(int year)
public int gettemp()
public void settemp(int temp)
public int compareto(pairtemp o) else
}public void write(dataoutput dataoutput) throws ioexception
public void readfields(datainput datainput) throws ioexception
@override
public string tostring() ';
}}
2.map需要自定義分割槽,繼承partitioner
重寫getpartition方法
使map生成的資料按照自定義分割槽方法,進入不同的分割槽
例如:年份year%reduce數量
public class mypartitioner extends partitioner
}
這樣同乙個年份的資料進入了同乙個分割槽,年份公升序,氣溫降序,結果如下
2007 100
2007 30
2007 22
2007 15
2008 43
2008 33
2008 33
2008 33
2008 33
2008 25
2008 24
2008 23
2008 22
2008 13
2009 43
2009 33
2009 25
2009 24
2009 23
此時距離我們獲取每年都最大值這一要求更近一步來,看上去,我們只需取每一年的第一條記錄就可以了
但上面的記錄整體是做為乙個newkey,就要用到分組的思想來,我希望按年分成3組,2007,2008,2009各一組
3.自定義分組,繼承writablecomparator
重寫了compare方法
public class mygroupcomparator extends writablecomparator
@override
public int compare(writablecomparable a, writablecomparable b)
}
分組後的資料傳送給reduce處理
4. reduce端處理
在這段**中輸出了第乙個key值,也就是按照年份公升序,氣溫降序後的每一組的第一條資料
public class maxreducer extends reducer
system.out.println("最後一條key資訊:"+key);
}}
看列印結果就能理解了
--------reduce---------------
第一條key資訊:pairtemp
2007:100
2007:30
2007:22
2007:15
最後一條key資訊:pairtemp
--------reduce---------------
第一條key資訊:pairtemp
2008:43
2008:33
2008:33
2008:33
2008:33
2008:25
2008:24
2008:23
2008:22
2008:13
最後一條key資訊:pairtemp
--------reduce---------------
第一條key資訊:pairtemp
2009:43
2009:33
2009:25
2009:24
2009:23
最後一條key資訊:pairtemp
4.驅動類額外增加
setpartitionerclass和setgroupingcomparatorclass
Map reduce二次排序
map reduce的流程切面 splitmapperpartitioncombinergroupreducer 這裡要解釋下 partition 和 group 它們都是shuffle的重要步驟 的區別.他們的作用都是為了reducer分配記錄去處理.但區別是partition是把記錄分給不同的r...
mapreduce 二次排序
所謂二次排序,對第1個字段相同的資料,使用第2個字段進行排序。舉個例子,電商平台記錄了每一使用者的每一筆訂單的訂單金額,現在要求屬於同乙個使用者的所有訂單金額作排序,並且輸出的使用者名稱也要排序。賬戶訂單金額 hadoop apache 200hive apache 550yarn apache 5...
mapreduce二次排序案例
為什麼需要二次排序?在mapreduce操作時,我們知道傳遞的會按照key的大小進行排序,最後輸出的結果是按照key排過序的。有的時候我們在key排序的基礎上,對value也進行排序。這種需求就是二次排序 解決思路 我們可以把key和value聯合起來作為新的key,記作newkey。這時,newk...