hadoop二次排序复合键比较与自定义排序器比较实现

nkkqxpd9  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(326)

在hadoop二次排序中,composite中的代码有以下方法来比较值,composite key类实现 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 .

lb3vh1jj

lb3vh1jj1#

我不知道你提到的代码是从哪里来的。
我会尽量用一般的方式来回答。
以下是hadoop二次排序权威指南的摘录,
使键成为自然键和自然值的组合。
排序比较器应该按复合键排序,即自然键和自然值。
复合密钥的分区器和分组比较器应该只考虑用于分区和分组的自然密钥。
对相似的键进行分组将非常有效。分组比较器就是为了这个目的,它有助于有效地识别相似的密钥块。
例如:假设您从Map器中获得以下键(复合键)。
a、 1个
b、 二
a、 二
b、 三
分组比较器将处理这些数据并按如下方式对它们进行排序,
a、 1个
a、 二
b、 二
b、 三
为了使二次排序生效,需要对值部分进行排序。这就是sortingcomparator正在实现的功能。
最后的输出是(假设您有一个分区器,它在复合键的键部分上进行分区)
a、 二
a、 1个
b、 三
b、 二

fumotvh3

fumotvh32#

只有在2种情况下才需要自定义分类器方法:1)customsorter类中的排序过程与compositekey类中的compareto方法不同2)您希望优先选择customsorter类的排序逻辑。如果不满足上述条件,compositekey类就足以进行排序。

相关问题