最近在學習mapreduce程式設計遇到很多用mr實現按某一列值排序,或二次排序的類似問題,於是試著用mr實現各種排序問題,最終有點小總結:無需在key物件之外寫任何排序函式,mr會完成按key值排序,具體詳解如下:
在這之前要先說一下writablecomparable介面。writable介面大家可能都知道,它是乙個實現了序列化協議的序列化物件。在hadoop中定義乙個結構化物件都要實現writable介面,使得該結構化物件可以序列化為位元組流,位元組流也可以反序列化為結構化物件。那writablecomparable介面是可序列化並且可比較的介面。mapreduce中所有的key值型別都必須實現這個介面,既然是可序列化的那就必須得實現readfiels()和write()這兩個序列化和反序列化函式,既然也是可比較的那就必須得實現compareto()函式,該函式即是比較和排序規則的實現。這樣mr中的key值就既能可序列化又是可比較的。下面幾符圖是api中對writablecomparable介面的解釋及其方法,還有乙個實現了該介面的物件的列子:
圖 一 writablecomparable 介面解釋
圖 二 writablecomparable 介面方法
圖 三 自定義物件實現writablecomparable 介面例子
所以總結上面,hadoop會呼叫key值型別的compareto函式按照該函式的要求對key值進行排序。所以你想對哪些列排序就要把哪些列併入到key值物件中,像二次排序那樣,要對兩列進行排序,兩列值都要併入key中,則key成為包含兩個屬性的復合key,hadoop 提供的key值可用的型別不能滿足要求,那就重寫乙個物件實現writablecomparable介面(類圖三),該物件包含連個屬性,並實現compareto函式,最後會根據key值對兩列資料排序,從而實現二次排序。本人也層試圖用mr實現對value的排序,最終沒能成功,也可能是本人水平有限,但至少會比對key排序複雜,這也是我要強調的不要試圖單純的對value進行排序,否則比較難實現排序。
史上最簡單mapreduce對key的正序和倒序
這個是資料 這個是倒序 上面兩張是效果圖,我這裡只給第一列數字排序了。接下來直接上 自己新建乙個類,繼承writablecompartor 重寫裡面的compare方法 public class sort extends writablecomparator override public intc...
map根據key排序 Map Reduce原理簡介
首先我們來思考下,當計算機集群在計算時,往往會遇到哪些的問題呢?1.高故障率 1000臺伺服器的集群 平均故障率 1 次 天 100萬台伺服器的集群 平均故障率 1000 次 天 故障率這麼高,如何保持資料的持續性,即在某些節點故障的情形下不影響依舊能夠使用資料?在執行時間較長的集群運算中,如何應對...
vue中key值與react中key值的區別
兩者演算法比較不同 分別對olds olde s e兩兩做samevnode比較,有四種值,舊集合的開頭和結束 olds,olde 新集合的開頭和結束 s e 當其中兩個能匹配上那麼真實dom中的相應節點會移到vnode相應的位置,這句話有點繞,打個比方 大意就是每次比較四個key值,匹配上的就移動...