我正在尝试编写一个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的哪个进程?
答案 0 :(得分:0)
执行的MR作业按键对输出进行排序。因此,如果要按值对reducer的输出进行排序,则需要编写另一个MR作业。