我试图理解默认grouping comparator
在Hadoop的MR中是如何工作的。
如果我们未在驱动程序代码中指定有关分组comparator
的任何内容,是否使用密钥的compareTo()
方法(假设Hadoop的内置数据类型,例如IntWritable
)。
我们拥有自定义密钥的情况如何,是否还依赖于密钥的compareTo()
方法?
我在网上搜索过,但是我没有得到满意的答案让我的疑惑清楚。任何人都可以帮助澄清这一点。
这个问题并没有重复,因为已经标记;我的问题不是要求分组比较器的作用,而是询问什么是默认实现以及我们有自定义键的情况。我不确定这个问题在什么基础上被标记为另一个SO问题的重复,这与提出“分组比较器”的需要有关。我提到了那个问题,这与这个问题无关。
答案 0 :(得分:1)
回答您的疑问
...是否使用密钥的
compareTo()
方法....
是的,但其compare()
方法来自实施
public static class Comparator extends WritableComparator
{
public Comparator() {
super();
}
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2)
{
int thisValue = readInt(b1, s1);
int thatValue = readInt(b2, s2);
return thisValue == thatValue ? 0 : thisValue < thatValue ? -1 : 1;
}
}
我们有自定义密钥的情况怎么样,它仍然存在 依赖于密钥的
compare()
方法?
是的,如果您想优化,可以使用默认实现。
示例writable
类型可能看起来像
public class MyWritable extends WritableComparator {
public MyWritable() {
super();
}
@Override
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
// Custom code
}
}
从doc开始,这是一个优化钩子。这意味着,此方法默认是实现的,但它应该用于优化或自定义代码。
请注意,还有一个compare(WritableComparable a, WritableComparable b)
,如果您使用WritableComparator(Class<? extends WritableComparable> keyClass)
进行实施,则可以覆盖。