我的reducer
输出如下 Key Value
1 1998-01-05 45
10 1998-01-09 20
2 1998-01-06 68
3 1998-01-07 85
4 1998-01-08 85
按字典顺序这是正确的,但我希望它以自然顺序排序,例如
Key Value
1 1998-01-05 45
2 1998-01-06 68
3 1998-01-07 85
4 1998-01-08 85
10 1998-01-09 20
我写了一个KeyComparator来实现这个目标,下面是代码,但即使这样也没有用。
public static class KeyComparator extends WritableComparator {
protected KeyComparator() {
super(IntWritable.class, true);
}
@SuppressWarnings("rawtypes")
public int compare(WritableComparable w1, WritableComparable w2) {
IntWritable t1 = (IntWritable) w1;
IntWritable t2 = (IntWritable) w2;
String t1Items = t1.toString();
String t2Items = t2.toString();
return t1Items.compareTo(t2Items);
}
}
注意我的mapper输出与reducer的格式相同,但reducer只输出最大值。
我缺少什么
答案 0 :(得分:3)
您正在比较字符串而不是比较值。 “10”< “2”即使10
> 2
。
您需要从IntWritable获取第一个字段或解析第一个数字并进行比较。
顺便说一句:如果您要使用toString()
,则无需先将其强制转换,因为所有Object
都支持此方法。
答案 1 :(得分:2)
您正在比较字符串
String t1Items = t1.toString();
String t2Items = t2.toString();
return t1Items.compareTo(t2Items);
你不应该这样做。比较数字。我不知道IntWritable
是什么,但你不应该从中创建字符串。提取整数并直接比较它们。
答案 2 :(得分:1)
在这种情况下,正确的方法是琐碎的方式:
public int compare(WritableComparable w1, WritableComparable w2) {
return w1.compareTo(w2);
}
IntWritable
已经以正确的方式实现了Comparable
接口。
也就是说,您可能甚至不需要自定义比较器类。