更改减速机排序顺序

时间:2012-11-06 12:54:04

标签: java hadoop mapreduce

我的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只输出最大值。

我缺少什么

3 个答案:

答案 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接口。

也就是说,您可能甚至不需要自定义比较器类。