Hadoop的默认分组比较器?

时间:2018-03-14 09:56:00

标签: java hadoop mapreduce yarn hadoop2

我试图理解默认grouping comparator在Hadoop的MR中是如何工作的。

如果我们未在驱动程序代码中指定有关分组comparator的任何内容,是否使用密钥的compareTo()方法(假设Hadoop的内置数据类型,例如IntWritable)。

我们拥有自定义密钥的情况如何,是否还依赖于密钥的compareTo()方法?

我在网上搜索过,但是我没有得到满意的答案让我的疑惑清楚。任何人都可以帮助澄清这一点。

修改

这个问题并没有重复,因为已经标记;我的问题不是要求分组比较器的作用,而是询问什么是默认实现以及我们有自定义键的情况。我不确定这个问题在什么基础上被标记为另一个SO问题的重复,这与提出“分组比较器”的需要有关。我提到了那个问题,这与这个问题无关。

1 个答案:

答案 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开始,这是一个优化钩子。这意味着,此方法默认是实现的,但它应该用于优化或自定义代码。

enter image description here

请注意,还有一个compare(WritableComparable a, WritableComparable b),如果您使用WritableComparator(Class<? extends WritableComparable> keyClass)进行实施,则可以覆盖。