我想排序我的減速器的輸出。我的減速機的輸出的一個示例如下所示:如何對減速機輸出進行排序?
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)));
}
}
請顯示您的reducer方法,以便我們確實可以幫到您 –
我做到了。請看一看。 –