2015-06-25 62 views
1

我想排序我的減速器的輸出。我的減速機的輸出的一個示例如下所示:如何對減速機輸出進行排序?

0,0 2.5 
0,1 3.0 
1,0 4.0 
1,1 1.5 

的減速器輸出被明顯地通過鑰匙的第一元件來分類的。但我想按鍵的第二個元素進行排序,以便輸出爲:

0,0 2.5 
1,0 4.0 
0,1 3.0 
1,1 1.5 

任何方式我都可以做到這一點?

請幫忙!

這是我的減速器:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.HashMap; 
import org.apache.hadoop.fs.FileSystem; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Reducer; 


public class RecReduce extends 
Reducer<Text, Text, Text, Text> { 
    public static int n=0; 
    @Override 
    public void setup(Context context) throws IOException, InterruptedException{ 
     FileSystem hdfs= FileSystem.get(context.getConfiguration()); 
     BufferedReader br = new BufferedReader(new InputStreamReader(hdfs.open(new Path(context.getConfiguration().get("outFile"))))); 
     String line=null; 
     while((line=br.readLine())!=null){ 
      n=Integer.parseInt(line); 
      break; 
     } 
     br.close(); 
     hdfs.close(); 
    } 
    public void reduce(Text key, Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 
     String[] value; 
     HashMap<Integer, Float> hashA = new HashMap<Integer, Float>(); 
     HashMap<Integer, Float> hashB = new HashMap<Integer, Float>(); 
     for (Text val : values) { 
      value = val.toString().split(","); 
      if (value[0].equals("A")) { 
       for(int z=1;z<=n;z++){ 
        hashA.put(z, Float.parseFloat(value[z]));} 
      } else{ 
       for(int a=1;a<=n;a++){ 
        hashB.put(a, Float.parseFloat(value[a]));} 
      } 
     } 
     float result = 0.0f; 
     float a_ij; 
     float b_jk; 
     for (int j=1;j<=n;j++) { 
      a_ij = hashA.containsKey(j) ? hashA.get(j) : 0.0f; 
      b_jk = hashB.containsKey(j) ? hashB.get(j) : 0.0f; 
      result +=a_ij*b_jk; 
     } 
     context.write(null, new Text(key.toString() + "," + Float.toString(result))); 
    } 
} 
+0

請顯示您的reducer方法,以便我們確實可以幫到您 –

+0

我做到了。請看一看。 –

回答

0

參考我answer另一個問題是基本相同的,因爲這一個 。

0

您可以使用組合鍵和組合鍵比較

創建一個類如

class Pair(){ 
    String key 
    String value; 
} 

,並用它在你的減速機的輸出這樣

context.write(new Pair(key.toString(), Float.toString(result)), null);

然後創建一個比較

public class PairComparator extends WritableComparator { 
    protected PairComparator() { 
     super(Pair.class, true); 
    } 
    @Override 
    public int compare(WritableComparable w1, WritableComparable w2) { 
     Pair k1 = (Pair)w1; 
     Pair k2 = (Pair)w2;   
     return k1.getValue().compareTo(k2.getValue()); 
    } 
} 

,然後使用比較你的工作定義
job.setSortComparatorClass(PairComparator.class);

我沒有檢查上面的代碼。這只是想法。

我希望這將有助於

+0

'job.setSortComparatorClass(PairComparator.class)'在map-phase之後和reduce-phase right之前調用。我不想這樣做,因爲每個Reducer只有一個值,因此映射後程序停滯不前。我想要的是在還原完成後進行排序。 –

相關問題