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
。我的代码与你的代码相同(除了不按字典排序)。