我想对减速机的输出进行排序。我的减速机输出示例如下所示:
0,0 2.5
0,1 3.0
1,0 4.0
1,1 1.5
reducer输出显然按键的第一个元素排序。但是我想通过键的第二个元素对它进行排序,以便输出为:
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 :(得分:0)
您可以使用复合键和复合键比较器
创建一个类,例如
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);
然后在作业定义中使用比较器
/foo/cron
我没有查看上面的代码。这只是想法。
我希望它会有所帮助
答案 1 :(得分:0)
请参阅我的answer另一个与此问题基本相同的问题