排序是數據分析中最常用的操作,沒有之一。
單字段升序:
利用 mapreduce 自身的排序機制,把需要排序的字段作爲 key 即可
自定義排序規則:
方案一:自定義 key
1. 自定義類實現 WritableComparable 接口,設置泛型爲自定義類
2. 聲明需要排序的字段,添加 setter && getter
3. 實現接口的 3 個方法
write:序列化屬性值爲二進制
readFields:從二進制反序列化屬性值
compareTo:自定義大小比較規則
4. 使用自定義 key 作爲 map 輸出的 key 類型
方案二:自定義排序規則
1. 自定義類繼承 WritableComparator
2. 重寫父類無參構造方法,指定 key 的類型
super(Text.class, true);
3. 重寫父類 compare(WritableComparable a, WritableComparable b) 方法,實現自定義比較規則
4. 設置 job 使用自定義排序規則
job.setSortComparatorClass()
二次排序(多字段排序):
先按照 ip 排序,ip 相同按照 count 排序
1. 把所有需要排序的字段放入 key 中
2. 自定義排序規則
3. 在 compare 中設置比較的順序
action 升序,count 降序
自定義聚合規則:
默認是 key 相同的 value 自動聚合
1. 自定義類繼承 WritableComparator
2. 重寫父類無參構造方法,指定 key 的類型
super(Text.class, true);
3. 重寫父類 compare(WritableComparable a, WritableComparable b) 方法,實現自定義聚合規則
返回 0 聚合,否則不聚合
4. 設置 job 使用自定義聚合規則
job.setGroupingComparatorClass()
Java 中的排序:
Java 中的所有排序都依賴 Comparable 進行大小比較的,並且都是升序排列
不能控制排序的方式,但是可以控制大小比較的結果
通過控制大小比較結果來影響排序結果
實現 Comparable 接口需要實現 compareTo 方法
返回值只看類型,不看數值
負數 this < o
0 this = o
正數 this > o
自定義排序,就是自定比較大小的規則,實現 compareTo 方法
正常的大小比較 == 升序
取反 == 降序
TopN:
取排序結果的前 n 位
1. 在 reduce 方法中利用 treeMap 保存 TopN 數據
刪除第一條,求最大的 TopN
刪除最後一條,求最小的 TopN
2. 在 cleanup 方法中輸出 TopN 數據
3. 爲了提高效率,需要先求出每個 map 的 TopN 數據,
再把 TopN 發送給 reduce 進行彙總