2012-07-26 49 views
3

將Map Output鍵以相反順序獲取到Reducer的最佳方法是什麼?默認情況下,減速器以按鍵的升序接收所有的鍵。任何幫助或意見廣泛讚賞。反向分類Reducer鍵

在簡單的話,在正常情況下,如果在地圖發射鍵1,4,3,5,2減速器接收相同1,2,3,4,5。我想減速機接受5,4,3,2,1

+1

將鍵設爲實現Comparable接口的類的對象,並根據自己的喜好重寫比較方法。 – Parzifal 2012-07-26 14:02:33

回答

4

在Hadoop 1.X中,您可以使用JobConf.setOutputKeyComparatorClass爲輸出指定自定義比較器類。您的比較器必須執行RawComparator interface

使用Hadoop 2.X,這是通過使用Job.setSortComparatorClass完成的,仍然使用RawComparator的實現。

+0

@ Wookai - 如果我不打擾你很多,你能否在新的hadoop API中建議等效於setOutputKeyComparatorClass? – 2012-07-26 14:22:22

+1

我更新了我的答案,以添加指向當前方法的鏈接。 – Wookai 2012-07-26 20:11:51

2

樣品,簡單的代碼

class MyKeyComparator extends WritableComparator { 
    protected DescendingKeyComparator() { 
     super(Text.class, true); 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public int compare(WritableComparable w1, WritableComparable w2) { 
     Text key1 = (Text) w1; 
     Text key2 = (Text) w2;   
     return -1 * key1.compareTo(key2); 
    } 
} 

然後將其添加到工作

job.setSortComparatorClass(MyKeyComparator.class); 

您可以更改以下文本類型按照烏拉圭回合使用。

Text key1 = (Text) w1; 
Text key2 = (Text) w2; 
1

您可以將您的密鑰乘以-1,然後再從您的映射器發出它。這將導致框架按升序對它進行排序,但負值-5,-4,-3,-2,-1然後在還原器中再次乘以-1得到5,4,3,2,1 。這會導致框架以sudo-descending排序。在更復雜的排序中,最好編寫一個用於比較的自定義類,然後將其設置在驅動程序類中。