My Mapper任务返回以下输出:
2 c
2 g
3 a
3 b
6 r
我已经编写了缩减器代码和keycomparator来生成正确的输出,但是如何获得Mapper输出的前3位(按计数排名前N位):
public static class WLReducer2 extends
Reducer<IntWritable, Text, Text, IntWritable> {
@Override
protected void reduce(IntWritable key, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
for (Text x : values) {
context.write(new Text(x), key);
}
};
}
public static class KeyComparator extends WritableComparator {
protected KeyComparator() {
super(IntWritable.class, true);
}
@Override
public int compare(WritableComparable w1, WritableComparable w2) {
// TODO Auto-generated method stub
// Logger.error("--------------------------> writing Keycompare data = ----------->");
IntWritable ip1 = (IntWritable) w1;
IntWritable ip2 = (IntWritable) w2;
int cmp = -1 * ip1.compareTo(ip2);
return cmp;
}
}
这是减速器输出:
r 6
b 3
a 3
g 2
c 2
减速器的预期输出按计数排在前3位,即:
r 6
b 3
a 3
答案 0 :(得分:1)
限制减速器的输出。这样的事情。
public static class WLReducer2 extends
Reducer<IntWritable, Text, Text, IntWritable> {
int count=0;
@Override
protected void reduce(IntWritable key, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
for (Text x : values) {
if (count > 3)
context.write(new Text(x), key);
count++;
}
};
}
将减速器数量设置为1. job.setNumReduceTasks(1)
。
答案 1 :(得分:1)
如果您的前N个元素可以存储在内存中,您可以使用TreeMap存储前N个元素,如果您的过程只能使用一个reducer 进行聚合。
map.firstKey()
进行比较。如果当前值大于树中的最小值,则将当前值插入树形图map.put(value, Item)
,然后从树map.remove(value)
中删除最低值。注意 值来比较您的记录必须是TreeMap中的键。 TreeMap的值应该是描述,标记,字母等;与数字相关。