在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;
}
我想知道为什么我们通过实现CustomKey
在WritableComparable
类中对值进行两次比较两次,然后我们再次创建一个CustomSorter
类以通过扩展{{}来对值进行排序1}}。
答案 0 :(得分:0)
我不确定您提到的代码来自哪里。
我会尝试以通用的方式回答它。
以下是Hadoop二级排序权威指南的摘录,
对类似的键进行分组在排序时非常有效。分组比较器就是为了这个目的,它有助于有效地识别相似的密钥块。
例如:假设您从映射器中获取了以下键(复合)。
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)