MapReduce的排序

排序是數據分析中最常用的操作,沒有之一。

單字段升序:
利用 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 進行彙總
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章