四、MapReduce中的排序

一、排序概述

1、在MapReduce的shuffle過程中執(zhí)行了三次排序,分別是:
map的溢寫階段:根據(jù)分區(qū)以及key進行快速排序
map的合并溢寫文件:將同一個分區(qū)的多個溢寫文件進行歸并排序,合成大的溢寫文件
reduce輸入階段:將同一分區(qū),來自不同map task的數(shù)據(jù)文件進行歸并排序

專注于為中小企業(yè)提供網(wǎng)站制作、成都網(wǎng)站制作服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)平遙免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了成百上千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

2、在MapReduce整個過程中,默認(rèn)是會對輸出的KV對按照key進行排序的,而且是使用快速排序。
map輸出的排序的,其實也就是上面的溢寫過程中的排序。
reduce輸出的排序,即reduce處理完數(shù)據(jù)后,MapReduce內(nèi)部會自動對輸出的KV按照key進行排序

以上排序都是根據(jù)KV中的Key進行排序的。所以當(dāng)我們自定義的類作為Key時,需要實現(xiàn)WritableComparable 接口,也就是實現(xiàn)里面的 compareTo() 方法,用于排序時進行比較。
比較規(guī)則如下:

public int compareTo(object other) {
    this>other 返回1,正序,返回 -1,逆序。
}

二、二次排序的定義

而在依據(jù)key進行排序時,如果key是一個復(fù)合對象,即該對象中包含多個成員屬性,那么在進行key比較時,就會涉及到多個屬性間的比較,而如果compareTo() 方法中,比較條件為兩個的話,就稱為二次排序

三、輔助排序的定義

輔助排序也叫分組排序,是指在reduce前的group過程中根據(jù)排序規(guī)則進行的分組,因為分組的時候是需要比較KV中key是否相同,如果相同才會歸為同一個組,如果不相等,就歸為不同的組,所以就涉及到key比較方法了。總的來說其實定義key在什么情況下才相等。這個過程可以自己定義分組的方法,也就是分組排序的實現(xiàn)類。
使用方法:
1、自定義分組類,繼承 WritableComparator
2、調(diào)用父類的構(gòu)造方法,創(chuàng)建實例
3、重寫父類的 compare方法

例子:

public class OrderGroupCompartor extends WritableComparator {

    protected OrderGroupCompartor() {
        super(OrderBean.class, true);
    }

    /**
     * 以orderbean對象中的ID為分組依據(jù)。
     * 同一ID的認(rèn)為是同一個group,一個group只會調(diào)用一次reduce
     *
     * @param a  比較對象1
     * @param b  比較對象2
     * @return
     */
    @Override
    public int compare(WritableComparable a, WritableComparable b) {
        OrderBean aOrderBean = (OrderBean) a;
        OrderBean bOrderBean = (OrderBean) b;

        if (aOrderBean.getID() > bOrderBean.getID()) {
            return 1;
        } else if (aOrderBean.getID() < bOrderBean.getID()) {
            return -1;
        } else {
            return 0;
        }
    }
}

我們要注意的是,在進行分組時,同一個分組內(nèi)的key是以第一個進入該分區(qū)的KV對中的key為準(zhǔn)的。如:

有兩個KV對:
1、<[1,褲子],20>
2、<[1,襪子],21>
其中key由id和物品名稱組成的,value則是物品價格
假設(shè)分組依據(jù)是根據(jù)key中的id來分組的,那么上面兩個KV是屬于同一個group,但是實際上這兩個KV
的key是不相等的。當(dāng)1號KV先進入該group,那么就會以1號的key作為該group的key,分組的結(jié)果為:
<[1,褲子],[20,21]>
如果2號KV先進入,則按照前面的規(guī)則,分組結(jié)果為:
<[1,襪子],[20,21]>

就會有這樣的情況的發(fā)生,我們要注意利用好這點。

那么誰先進入該group的呢?很簡單,是按照事先排序的順序,在前面的自然先進入。這里的排序其實就是前面reduce端的歸并排序的結(jié)果,而使用的排序依據(jù)其實就是key的包裝類中compareTo方法,屬于普通排序里面的東西。

編寫好自定義的分組排序類之后,需要在job中指定好自定義的分組類:

job.setGroupingComparatorClass(OrderGroupCompartor.class);

四、排序?qū)嵗?/h2>

普通排序請看 “MapReduce-統(tǒng)計手機號流量”
二次排序和輔助排序請看 “MapReduce--獲取價格最高的商品”

本文標(biāo)題:四、MapReduce中的排序
URL標(biāo)題:http://m.kartarina.com/article42/pgojec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計外貿(mào)建站虛擬主機品牌網(wǎng)站建設(shè)全網(wǎng)營銷推廣做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
主站蜘蛛池模板: 亚洲av无码片在线播放| 久久亚洲AV成人无码国产| 无码H黄肉动漫在线观看网站| 亚洲精品无码不卡在线播HE | 亚洲熟妇无码AV在线播放| 亚洲av无码无在线观看红杏| 无码中文字幕乱码一区| 亚洲中久无码永久在线观看同| 无码人妻精品一区二区三18禁 | 精品欧洲AV无码一区二区男男| 亚洲AV日韩AV永久无码色欲| 国产麻豆天美果冻无码视频| 一本大道无码av天堂| 国产精品无码成人午夜电影| 97无码免费人妻超级碰碰夜夜| 日韩人妻精品无码一区二区三区| 免费无码午夜福利片69| 亚洲av无码成人精品区一本二本| 日韩成人无码中文字幕| 色视频综合无码一区二区三区| 亚洲精品无码不卡在线播放| 久久久久亚洲Av片无码v | 亚洲精品中文字幕无码蜜桃| 国产精品无码亚洲一区二区三区| 日韩AV无码中文无码不卡电影| 中文字幕丰满伦子无码| 亚洲AV无码一区二三区| 在线A级毛片无码免费真人| 无码夫の前で人妻を犯す中字| 亚洲AV无码成人专区片在线观看| 中文字幕在线无码一区二区三区 | 人妻无码一区二区视频| 无码熟妇人妻av| 精品久久久久久久无码久中文字幕 | 永久免费AV无码网站国产| 国产成人无码精品久久久免费 | 亚洲精品无码av片| 在线观看无码AV网址| 中文字幕无码中文字幕有码| 中日韩精品无码一区二区三区| 亚洲色在线无码国产精品不卡|