【问题标题】:Hadoop's default Grouping comparator?Hadoop的默认分组比较器?
【发布时间】:2018-03-14 09:55:59
【问题描述】:

我试图了解默认 grouping comparator 在 Hadoop 的 MR 中的工作原理。

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

我们有自定义key的情况怎么样,还是依赖key的compareTo()方法吗?

我确实在网上搜索过,但我没有得到满意的答案来解决我的疑问。任何人都可以帮助澄清这一点。

编辑

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

【问题讨论】:

    标签: java hadoop mapreduce hadoop-yarn hadoop2


    【解决方案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;
         }
       }
    

    在我们有自定义键的情况下,它仍然存在吗? 依赖key的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&lt;? extends WritableComparable&gt; keyClass) 来实现,可以覆盖它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多