0

在 Hadoop 二级排序中,Composite 中的代码具有以下比较值的方法,Composite 键类实现WritableComparable:-

@Override
public int compareTo(CustomKey o) {

    int result = firstName.compareTo(o.getFirstName());     
    log.debug("value is " + result);                
    if (result == 0) {
        return lastName.compareTo(o.getLastName());
    }
    return result;
}

在我们创建的用于执行扩展WritableComparator的二级排序的自定义排序器中,代码如下所示:-

@Override
public int compare(WritableComparable w1, WritableComparable w2) {
    CustomKey key1 = (CustomKey) w1;
    CustomKey key2 = (CustomKey) w2;
    int value = key1.getFirstName().compareTo(key2.getFirstName());
    if (value == 0) {           
        return -key1.getLastName().compareTo(key2.getLastName());       
    }
    return value;
}

我想知道为什么我们CustomKey通过实现来比较值两次以便在类中排序一次WritableComparable,然后我们CustomSorter再次创建一个类来通过扩展对值进行排序WritableComparator

4

2 回答 2

0

我不确定您提到的代码是从哪里获取的。

我将尝试以通用的方式回答它。

这是 Hadoop Definitive Guide for Secondary Sorting 的摘录,

  1. 使键成为自然键和自然值的组合。
  2. 排序比较器应该按复合键排序,即自然键和自然值。
  3. 复合键的分区器和分组比较器应该只考虑用于分区和分组的自然键。

对相似的键进行排序时,将它们分组将非常有效。分组比较器就是为此而设计的,它有助于有效地识别相似的键块。

例如:假设您从映射器中获取以下键(复合)。

A,1

乙,2

A2

B,3

分组比较器将处理这些并将它们排序如下,

A,1

A2

乙,2

B,3

为了使二次排序起作用,您需要对值部分进行排序。这就是 SortingComparator 正在实现的目标。

最终输出将是,(假设您有一个分区器,它在复合键的键部分上进行分区)

A2

A,1

B,3

乙,2

于 2015-12-29T05:33:47.477 回答
0

只有在 2 个条件下才需要您的自定义排序方法:1)CustomSorter 类中的排序过程与您的 CompositeKey 类中的 compareTo 方法中的排序过程不同 2)您希望优先考虑 CustomSorter 类的排序逻辑。如果不满足上述条件,您的 CompositeKey 类就足以进行排序。

于 2017-06-09T10:18:37.673 回答