大数据全系列 教程
1869个小节阅读:465.2k
目录
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
如果没有设置排序比较器,如何从Key对应的类中找比较器?
常见的Key对应的类如Text、LongWritable等。
Ctrl+Shift+R->Text.java
xxxxxxxxxx
//在Text类内部定义的比较器的类Comparator
//1.继承WritableComparator抽象类
public static class Comparator extends WritableComparator {
//2.添加一个无参数的构造方法
public Comparator() {
//3.通过super(Text.class) 调用父类的构造方法,并传递外部类Text.class
super(Text.class);
}
/*4.根据需要覆写父类的比较的方法
也可以覆写其他的方法,比如:
public int compare(WritableComparable a, WritableComparable b) {
return a.compareTo(b);
}
*/
@Override
public int compare(byte[] b1, int s1, int l1,
byte[] b2, int s2, int l2) {
int n1 = WritableUtils.decodeVIntSize(b1[s1]);
int n2 = WritableUtils.decodeVIntSize(b2[s2]);
return compareBytes(b1, s1+n1, l1-n1, b2, s2+n2, l2-n2);
}
}
//5.注册比较器的类
static {
// register this comparator
WritableComparator.define(Text.class, new Comparator());
}
Ctrl+点击 如上的define(),查看如何注册的比较器。
xxxxxxxxxx
private static final ConcurrentHashMap<Class, WritableComparator> comparators
= new ConcurrentHashMap<Class, WritableComparator>();
public static void define(Class c, WritableComparator comparator) {
comparators.put(c, comparator);
}
读取Key对应类注册的比较器的实例:
xxxxxxxxxx
WritableComparator.get(getMapOutputKeyClass().asSubclass(WritableComparable.class),
Ctrl+单击如上的get方法
xxxxxxxxxx
public static WritableComparator get(
Class<? extends WritableComparable> c, Configuration conf) {
WritableComparator comparator = comparators.get(c);
if (comparator == null) {
// force the static initializers to run
forceInit(c);
// look to see if it is defined now
comparator = comparators.get(c);
// if not, use the generic one
if (comparator == null) {
comparator = new WritableComparator(c, conf, true);
}
}
// Newly passed Configuration objects should be used.
ReflectionUtils.setConf(comparator, conf);
return comparator;
}