如何对减速机输出进行排序?

时间:2015-06-25 10:28:26

标签: java hadoop mapreduce

我想对减速机的输出进行排序。我的减速机输出示例如下所示:

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)));
    }
}

2 个答案:

答案 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另一个与此问题基本相同的问题