源碼中有這樣一段代碼
1. map端排序獲取的比較器
1
2
3
4
5
6
7
8
9
10
11
12
|
public rawcomparator getoutputkeycomparator() { // 獲取mapreduce.job.output.key.comparator.class,必須是rawcomparator類型,如果沒設置,是null class <? extends rawcomparator> theclass = getclass( jobcontext.key_comparator, null , rawcomparator. class ); // 如果用戶自定義了這個參數,那么實例化用戶自定義的比較器 if (theclass != null ) return reflectionutils.newinstance(theclass, this ); // 默認情況,用戶是沒用自定義這個參數 // 判斷map輸出的key,是否是writablecomparable的子類 // 如果是,調用當前類的內部的comparator! return writablecomparator.get(getmapoutputkeyclass().assubclass(writablecomparable. class ), this ); } |
總結: 如何對感興趣的數據進行排序?
① 數據必須作為key
② 排序是框架自動排序,我們提供基于key的比較器,也就是comparator,必須是rawcomparator類型
a) 自定義類,實現rawcomparator,重寫compare()
指定mapreduce.job.output.key.comparator.class為自定義的比較器類型
b)key實現writablecomparable(推薦)
③ 實質都是調用相關的comparato()方法,進行比較
2. reduce端進行分組的比較器
1
2
3
4
5
6
7
8
9
10
11
12
13
|
rawcomparator comparator = job.getoutputvaluegroupingcomparator(); // 獲取mapreduce.job.output.group.comparator.class,必須是rawcomparator類型 // 如果沒用設置,直接獲取maptask排序使用的比較器 // 也是比較key public rawcomparator getoutputvaluegroupingcomparator() { class <? extends rawcomparator> theclass = getclass( jobcontext.group_comparator_class, null , rawcomparator. class ); if (theclass == null ) { return getoutputkeycomparator(); } // 如果設置了,就使用設置的比較器 return reflectionutils.newinstance(theclass, this ); } |
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對服務器之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
原文鏈接:https://blog.csdn.net/qq_43193797/article/details/86019761