开发者学堂课程【Hadoop 分布式计算框架 MapReduce:GroupingComparator分组(辅助排序)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/94/detail/1533
GroupingComparator 分组(辅助排序)
接下来我们来进入分组排序的学习,它所对应的步骤如下:
对 Reduce 阶段的数据根据某一个或几个字段进行分组。
一. 分组排序步骤:
自定义类继承 WritableComparator。
(2)重写 compare()方法
@overridew
Public int compare(WritableComparable a,writableComparable b)
{
//比较的业务逻辑
return result;
}
(3)创建一个构造将比较对象的类传给父类.
protected OrderGroupingComparator () {
super(OrderBean.class, true);
}
三、根据以上,我们再创建一个类名为 OrderGroupingComparator 的类
其中要注意它是继承而并不是实现,
之前我们写的都是实现而并非继承
开始编写时,先自定义继承 WritableComparator,再手动添加包。输入 co, 点击第三个导入 compare 方法之后。
定义 aBean为OrderBean 类型,再将 a 强制转换成 OrderBean 类型以方便赋值,再定义 bBean。使用 if..else 语句比较 aBean 和 bBean 的 id 大小,大于返回1,小于返回 -1,相等返回 0,最后令返回值为 result。
但代码到此远远不行,我们还应该写一个构造,并且 super(... , ... ) 其中当前比较是谁 super 的第一个参数就是谁
且 super 中为什么传 ture 呢,我们可以鼠标左键点击按住 ctrl 鼠标点击 super 进入查看解码,可以看出,如果为 ture 就创建 newkey( ),而不为 ture 时就会报空指针异常
到此我们分组排序的代码就写完了,而我们通过把该行注释的代码给放回程序中,就可以构造我们所写程序和原来程序的关系
最后再查看效果,和我们所想要的一样,输出了每个 id 的最大值
完整代码:
1.
package com.atguigu.mr.order;
2.
Import org.apache.hadoop.io.writableComparable;
3.
import org.apache.hadoop.io.writableComparator;
4.
public class OrderGroupingComparator extends writableComparator{
5.
Protected OrderGroupingComparator(){
6.
Super(OrderBean.class,ture);
7.
}
8.
@Override
9.
public int compare(WritableComparable a,writableComparable b){
10. //要求只要 id 相同,就认为是相同的 key
11.
OrderBean aBean = (orderBean) a;
12.
OrderBean bBean = (orderBean) b;
13.
int result;
14.
if (aBean.getOrder_id() > bBean.getOrder_id()){
15.
result = 1;
16.
}else if(aBean.getorder_id() < bBean.getOrder_id()){
17.
result = -1;
18.
}else {
19.
result = 0;
20.
}
21.
Return result;
22. }