Java 更改减速机排序顺序

Java 更改减速机排序顺序,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我的减速机有以下输出 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

我的减速机有以下输出

    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);
            }
    }
注意,我的映射器输出的格式与reducer相同,但reducer只是输出最大值


我缺少什么

您正在比较字符串,而不是比较值。“10”<“2”,即使
10
2

您需要从IntWritable中获取第一个字段,或者解析第一个数字并进行比较


顺便说一句:如果你要使用
toString()
,你不需要先强制转换它,因为所有
对象都支持这种方法。

你是在比较字符串而不是比较值。“10”<“2”,即使
10
2

您需要从IntWritable中获取第一个字段,或者解析第一个数字并进行比较


顺便说一句:如果要使用
toString()
,则不需要首先强制转换它,因为所有
对象都支持此方法。

您正在比较字符串

               String t1Items = t1.toString();
               String t2Items = t2.toString();
               return t1Items.compareTo(t2Items);

你不应该这样做。比较一下数字。我不知道什么是
intwriteable
,但您不应该从中创建字符串。提取整数并直接比较它们。

您正在比较字符串

               String t1Items = t1.toString();
               String t2Items = t2.toString();
               return t1Items.compareTo(t2Items);

你不应该这样做。比较一下数字。我不知道什么是
intwriteable
,但您不应该从中创建字符串。提取整数并直接进行比较。

在这种情况下,正确的方法是简单的方法:

public int compare(WritableComparable w1, WritableComparable w2) {
  return w1.compareTo(w2);
}
intwriteable
已经以正确的方式实现了
Comparable
接口


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

在这种情况下,正确的方法是简单的方法:

public int compare(WritableComparable w1, WritableComparable w2) {
  return w1.compareTo(w2);
}
intwriteable
已经以正确的方式实现了
Comparable
接口


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

它现在按正确的顺序排序,但它会删除以相同整数开头的其他键。e、 g 1 1998-01-05 45、1 1998-01-05 46;它放弃第一个,保留第二个。您知道这可能是什么原因吗?如果您使用的是SortedMap或SortedSet,它们将忽略重复项。解决方案是使用一个列表并使用Collections.sort()对其进行排序。它现在按正确的顺序排序,但会删除以相同整数开头的其他键。e、 g 1 1998-01-05 45、1 1998-01-05 46;它放弃第一个,保留第二个。您知道这可能是什么原因吗?如果您使用的是SortedMap或SortedSet,它们将忽略重复项。解决方案是使用一个列表并使用Collections.sort()对其进行排序。这将提供我不想要的字典顺序。然后,代码中会出现另一种错误。
intwriteable
肯定不会按字典顺序排序。它甚至不包含字符串表示,而是一个原语
int
。我的代码与你的代码相同(除了不按字典顺序排序)。这将给我按字典顺序排序的结果,这不是我想要的。然后你的代码中会出现另一种错误。
intwriteable
肯定不会按字典顺序排序。它甚至不包含字符串表示,而是一个原语
int
。我的代码与你的代码相同(除了不按字典排序)。