2015-09-25 59 views
0

我的映射任務返回我下面的輸出:從映射器輸出獲得前N項 - MapReduce的

2 c 
2 g 
3 a 
3 b 
6 r 

我已經寫了減速的代碼和keycomparator產生正確的輸出,但我怎麼拿到前3名了(前N個通過計數)映射器輸出的:

public static class WLReducer2 extends 
     Reducer<IntWritable, Text, Text, IntWritable> { 

    @Override 
    protected void reduce(IntWritable key, Iterable<Text> values, 
      Context context) throws IOException, InterruptedException { 

     for (Text x : values) { 
      context.write(new Text(x), key); 
     } 

    }; 

} 

public static class KeyComparator extends WritableComparator { 
    protected KeyComparator() { 
     super(IntWritable.class, true); 
    } 

    @Override 
    public int compare(WritableComparable w1, WritableComparable w2) { 
     // TODO Auto-generated method stub 

     // Logger.error("--------------------------> writing Keycompare data = ----------->"); 
     IntWritable ip1 = (IntWritable) w1; 
     IntWritable ip2 = (IntWritable) w2; 
     int cmp = -1 * ip1.compareTo(ip2); 

     return cmp; 
    } 
} 

這是減速機的輸出:

r 6 
b 3 
a 3 
g 2 
c 2 

預期的輸出來回m減速機前幾位是:

r 6 
b 3 
a 3 

回答

1

限制從減速機輸出。像這樣的東西。

public static class WLReducer2 extends 
     Reducer<IntWritable, Text, Text, IntWritable> { 
    int count=0; 
    @Override 
    protected void reduce(IntWritable key, Iterable<Text> values, 
      Context context) throws IOException, InterruptedException { 

     for (Text x : values) { 
      if (count > 3) 
      context.write(new Text(x), key); 
      count++; 
     } 

    }; 
} 

將減速器的數量設置爲1. job.setNumReduceTasks(1)

+0

謝謝,該解決方案確實爲我工作。將減速器的數量設置爲1不會造成性能問題? – DevHelp

+0

我們不會寫很多輸出,因爲我們需要計算前N個元素,所以我們必須將數據帶到單個縮減器來計算它。你可以使用一個組合器(取決於數據集),這將減少一些性能瓶頸。 –

1

如果您的Top-N元素可以存儲在內存中,則可以使用TreeMap來存儲Top-N元素,以及您的過程是否可以僅使用一個還原器進行聚合。

  1. 實例化在減速機的設置()方法的實例變量TreeMap中。
  2. 在您的減速器()方法中,您應該彙總該鍵組的所有值,然後將結果與樹中的第一個(最低)鍵map.firstKey()進行比較。如果當前值大於樹中的最小值,則將當前值插入樹圖map.put(value, Item),然後從樹map.remove(value)中刪除最低值。
  3. 在還原器的清理()方法中,按要求的順序向輸出寫入所有的TreeMap元素。

注:來比較你的記錄必須在你的樹形圖中關鍵。而你的TreeMap的的值應該是描述,標籤,字母等;與號碼相關。

相關問題