MapReduce:为什么可以';我不能做这样的第二种排序(Hadoop)?

MapReduce:为什么可以';我不能做这样的第二种排序(Hadoop)?,hadoop,mapreduce,Hadoop,Mapreduce,我已经使用正确的方法实现了一个二级排序:复合键、复合键比较器类、自然键分组比较器类和自然键分区器类 然而,在我意识到这是必要的之前,我做了以下工作: class CompositeKey extends WritableComparable<CompositeKey> { String name; // Natural Key Date time; // Secondary Sort on this value // Constructor p

我已经使用正确的方法实现了一个二级排序:复合键、复合键比较器类、自然键分组比较器类和自然键分区器类

然而,在我意识到这是必要的之前,我做了以下工作:

class CompositeKey extends WritableComparable<CompositeKey> {
    String name; // Natural Key
    Date time;   // Secondary Sort on this value

    // Constructor

    public void readFields(DataInput in) { ... }
    public void readFields(DataInput out) { ... }
    public int compareTo(CompositeKey compositeKey) { 
        int result = getName().compareTo(compositeKey.getName());
        if (result == 0) {
            result = getTime().compareTo(compositeKey.getTime());
        }
        return result
    }

    public boolean equals(Object compositeKey) {
        // Similar code to compareTo()
    }


} 

我假设如果我把它放进去,它仍然不起作用(考虑到每个人都建议使用上面列出的方法进行二次排序)。为什么不呢?

通常,当您希望值按辅助键排序并按主键分组时,会使用辅助排序。仅使用复合键只允许您按主键和辅助键进行分组;一旦到达相应的减缩器,它就不会以任何排序顺序获取值

具体来说:“名称”是主键,“时间”是次键

使用二级排序:每个减速机获取与一个“名称”对应的所有值,并按排序顺序获取“时间”的每个数据点,例如名称:Bob,时间:1,2,3


只使用一个复合键:每个reducer获得与每个“Name”、“Time”对对应的所有值。不能保证同一个减速机将包含与同一名称对应的所有名称、时间对,因此不能保证按时间顺序处理Bob的值。

您可以尝试将
名称的类型更改为hadoop的
文本。这对我很有帮助。

我不明白的是,既然我写了
equals
compare
,或者
compareto
方法,为什么每个减速机都会得到对应于每个“Name”,“Time”对的所有值,而不是每个“Name”?如果排序/缩减阶段不使用这些方法中的任何一种来决定“名称”、“时间”,它将通过哪种机制决定使用“名称”、“时间”?这将是映射器输出键/缩减器输入键。它在JobConf中定义,例如。,
350      /** A WritableComparator optimized for Text keys. */
351      public static class Comparator extends WritableComparator {
352        public Comparator() {
353          super(Text.class);
354        }
355    
356        @Override
357        public int compare(byte[] b1, int s1, int l1,
358                           byte[] b2, int s2, int l2) {
359          int n1 = WritableUtils.decodeVIntSize(b1[s1]);
360          int n2 = WritableUtils.decodeVIntSize(b2[s2]);
361          return compareBytes(b1, s1+n1, l1-n1, b2, s2+n2, l2-n2);
362        }
363      }
364    
365      static {
366        // register this comparator
367        WritableComparator.define(Text.class, new Comparator());
368      }