WritableComparator是一个类 这个类是用于mapreduce编程模型中的比较 排序
mapreduce中有两次排序 一次是 在环形缓冲区域之中进行分区 排序
还有一次是数据在reduce端获取文件之后进行分组
现在我讲的是后面那个
//Define the comparator that controls which keys are grouped together or a single call to Reducer#reduce
job.setGroupingComparatorClass(MyComparator.class);
上面是我们在定义job时候进行的配置 配置如何进行分组
setGroupingComparatorClass内部的参数是RawComparator
而WritableComparator是实现RawComparator
所以我们直接继承WritableComparator类就可以自己定义一个MyComparator
public static class MyComparator extends WritableComparator {
public MyComparator() {
super(Text.class,true);
}
@Override
public int compare(WritableComparable a, WritableComparable b) {
Text a1 = (Text) a;
Text b1 = (Text) b;
if (a1.toString().equals("hello") && b1.toString().equals("hello")) {
return -1;
} else {
return 0;
}
}
}
上面这段代码我必须说一个坑 坑了我好几个小时 最后在statckvoerflow网站上才找到的提示
就是那个无参构造子 必须调用父类的构造子 不然会报空指针 未初始化 buffer
通过查找源码 也确实发现了这个问题
protected WritableComparator(Class<? extends WritableComparable> keyClass,
Configuration conf,