默认分组
默认情况下的分组和排序的规则是一样的,他们调用的都是compareTo()方法。
排序:compareTo()返回值 调整数据顺序
排序规则相同的会排在一起
分组:compareTo()调用的是返回值是否为0
返回值为0的为0的全部为一组
返回值不为0的为新的组
底层实现: 调用一个类 WritableComparetor 是一个普通类
/*
分组按照map输出的key(序列化、比较)
map输出的key肯定是WritableCompareable的子类
*/
@SuppressWarnings("unchecked")
public int compare(WritableComparable a, WritableComparable b) {
//map输出的key的compareTo方法
return a.compareTo(b);
}
默认分组调用的就是 key的compareTo()
key是默认类型,默认类型 compareTo 方法 比较的是实际的值(数值、Text)
key是自定义类型,自定义的compareTo方法
自定义分组
1)写一个分组类继承WritableComparator类
2)重写compare方法,重新定义分组算法
3)在job中指定分组类
//指定分组类
job.setGroupingComparatorClass(Group.class);
报错:Caused by: java.lang.NullPointerException
分组类中有错
默认不会创建compare方法中的参数 WritableComparable 对象的
解决方法:
//重新调用父类的构造方法
public Group() {
//调用父类的构造, 第二个参数为true 创建map的key对象
super(Stu.class,true);
}
分组是在排序的基础上进行的,只会比较排序结果的前后相连的数据,不会跳跃比价的
无参构造
protected WritableComparator() {
this(null);
}
/** Construct for a {@link WritableComparable} implementation.
keyClass------>map的key
null
false