在存储之前处理Reducer的结果

时间:2014-05-23 11:46:44

标签: java hadoop mapreduce hbase

我正在尝试编写一个HBase MapReduce作业,它将生成我的HBase表的前10个用户。

使用以下Reducer,

class Top10usersReducer extends Reducer<Text, IntWritable, Text, TreeMap<Text,IntWritable>  {

public static final byte[] CF = "infos".getBytes();
public static final byte[] COUNT = "count".getBytes();
static TreeMap<Text,IntWritable> map = new TreeMap<Text,IntWritable>();

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

        int sum = 0;

        for (IntWritable val : values) {
            sum += val.get();
        }
        map.put(key, new IntWritable(sum));
        context.write(null,map);

}
}

我有这个输出,每条记录存储在一行:

id11841=4,id11993=8,id12493=6,id12592=2,id12706=7,id12871=1,id12990=3,id13092=10,id13528=5,id13580=9 

我想得到这样的结果:

id13092=10,id13580=9,id11993=8,id12706=7,id12493=6,id13528=5,id11841=4,id12990=3,id12592=2,id12871=1

请注意,为了实现这一目标,要添加到Reducer的哪个进程?

1 个答案:

答案 0 :(得分:0)

执行的MR作业按键对输出进行排序。因此,如果要按值对reducer的输出进行排序,则需要编写另一个MR作业。