MapReduce二次排序

2021-08-28 13:31:20 字數 2972 閱讀 6364

預設情況下,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...