Hadoop辅助排序复合键compareTo与自定义排序器比较实现

时间:2015-12-29 04:02:24

标签: java hadoop mapreduce bigdata secondary-sort

在Hadoop Secondary排序中,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;
}

我想知道为什么我们通过实现CustomKeyWritableComparable类中对值进行两次比较两次,然后我们再次创建一个CustomSorter类以通过扩展{{}来对值进行排序1}}。

2 个答案:

答案 0 :(得分:0)

我不确定您提到的代码来自哪里。

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

以下是Hadoop二级排序权威指南的摘录,

  1. 使密钥成为自然键和自然值的组合。
  2. 排序比较器应按复合键排序,即 自然的关键和自然价值。
  3. 复合键的分区器和分组比较器应该考虑 只是分区和分组的自然键。
  4. 对类似的键进行分组在排序时非常有效。分组比较器就是为了这个目的,它有助于有效地识别相似的密钥块。

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

    A,1

    B,2

    A,2

    B,3

    分组比较器将对这些进行分类并对它们进行排序,如下所示

    A,1

    A,2

    B,2

    B,3

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

    最终输出将是(如果您有分区程序,则在复合键的关键部分上进行分区)

    A,2

    A,1

    B,3

    B,2

答案 1 :(得分:0)

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