Java Hadoop二级排序复合键比较与自定义排序器比较实现
在Hadoop二级排序中,Composite中的代码具有以下比较值的方法,Composite键类实现了Java Hadoop二级排序复合键比较与自定义排序器比较实现,java,hadoop,mapreduce,bigdata,secondary-sort,Java,Hadoop,Mapreduce,Bigdata,Secondary Sort,在Hadoop二级排序中,Composite中的代码具有以下比较值的方法,Composite键类实现了writeablecomparable:- @Override public int compareTo(CustomKey o) { int result = firstName.compareTo(o.getFirstName()); log.debug("value is " + result); if (result =
writeablecomparable
:-
@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;
}
我想知道为什么我们通过实现
writeablecomparable
在CustomKey
类中比较两次值进行排序,然后我们再次创建一个CustomSorter
类,通过扩展writeablecomparator对值进行排序。我不确定您引用的代码来自何处
我将试着用一般的方式回答这个问题
以下是Hadoop二级排序最终指南的摘录
使关键点成为自然关键点和自然值的组合
排序比较器应该按组合键排序,即
自然的关键和自然的价值
复合键的分区和分组比较器应该考虑
只有用于分区和分组的自然键
当对相似的键进行排序时,对它们进行分组将非常有效。分组比较器就是为了这个目的,它有助于有效地识别相似的密钥块
例如:假设您从映射器中获得以下键(复合键)
A、 一,
B、 二,
A、 二,
B、 三,
分组比较器将处理这些数据,并按如下方式对它们进行排序
A、 一,
A、 二,
B、 二,
B、 三,
要使二次排序正常工作,需要对值部分进行排序。这就是排序比较器正在实现的功能
最后的输出是(如果您有一个分区器,它在复合键中的键部分上进行分区)
A、 二,
A、 一,
B、 三,
B、 2只有在2种情况下才需要自定义分拣机方法:1)CustomSorter类中的分拣过程与CompositeKey类中的方法不同2)您希望优先选择CustomSorter类的分拣逻辑。
如果不满足上述条件,您的CompositeKey类将足以进行排序。您可以提供从何处获取此代码的参考信息吗?您好,完整代码如下:-