设计思路:因为mapreduce对key能实现自动排序,当key为数字时就按自然顺序排序,是字母时按字典顺序排序。所以处理这个案例时巧妙的使用mapreduce对key值的自动排序功能,将employee对象直接作为key,并重新定义当key为employee对象时,mapreduce的排序规则。
map阶段:将employee对象作为key,可以将员工的工资作为value,或者因为员工工资可以从key中的employee对象中直接取得,所以value可以直接设置为NullWritable
reduce阶段:在对reduce的输入参数value进行遍历时,里面的对象都是根据key自动排好序的,所以直接输出即可。
这里关键的处理步骤是对employee对象方法进行处理,为了其交付给mapreduce自动排序,employee对象必须实现WritableComparable接口,并且重新write、readFields、compareTo方法。
注意:
(1)write、readFields方法是序列化和反序列化的过程,它要求两方法中属性的顺序和类型必须一直,否者将有异常;
(2)compareTo方法重新定义对象的排序规则,我们直接将对象按照工资的大小来进行排序。
package week06;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
/*
* Employee Object
*/
public class Employee implements WritableComparable<Employee> {
private String empno;
private String ename;
private String job;
private String mgr;
private String hiredate;
private int sal;
private int comm;
private String deptno;
private String dname;
private String loc;
private boolean valid = true;
public void set(Employee emp) {
this.valid = emp.isValid();
this.empno = emp.getEmpno();
this.ename = emp.getEname();
this.job = emp.getJob();
this.mgr = emp.getMgr();
this.hiredate = emp.getHiredate();
this.sal = emp.getSal();
this.comm = emp.getComm();
this.deptno = emp.getDeptno();
this.dname = emp.getDname();
this.loc = emp.getLoc();
}
//Emp_Test8使用这个compareTo方法
public int compareTo(Employee bean) {
if (this.sal >= bean.getSal()) {
return -1;
} else {
return 1;
}
}
//Emp_Test9使用这个compareTo方法
// public int compareTo(Employee bean) {
// int total = this.sal + this.comm;
// int bean_total = bean.getSal() + bean.getComm();
// if (total >= bean_total) {
// return -1;
// } else {
// return 1;
// }
// }
public void write(