本文在实现统计各部门员工薪水总和功能的基础上进行,还没实现的话请参考:实现统计各部门员工薪水总和功能
优化项目:
1.使用序列化
2.实现分区Patitioner
3.Map使用Combiner
使用序列化
本案例是在实现统计各部门员工薪水总和功能基础上进行。
序列化与反序列化:
序列化是指将Java对象转换为二进制串的过程,方便网络传输;
反序列化是指将二进制串转换为Java对象的过程。
MapReduce编程模型及编程思路:
与 实现统计各部门员工薪水总和功能相比,本案例要多建立一个Employee类,Employee类代码如下:
代码
Employee.java
package com.wang.employee;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* @author CreazyHacking
* @version 1.0
* @date 12/4/2021 10:12 PM
*/
public class Employee implements Writable {
//字段名 EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO
//数据类型:Int,Char, Char , Int, Date , Int Int, Int
//数据: 7654, MARTIN, SALESMAN, 7698, 1981/9/28, 1250, 1400, 30
//由以上定义变量
private int empno; //员工编号
private String ename; //姓名
private String job; //部门
private int mgr; //经理
private String hiredate; //时间
private int sal; //工资
private int comm;//奖金
//序列化方法:将java对象转化为可跨机器传输数据流(二进制串/字节)的一种技术
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeInt(this.empno);
dataOutput.writeUTF(this.ename);
dataOutput.writeUTF(this.job);
dataOutput.writeInt(this.mgr);
dataOutput.writeUTF(this.hiredate);
dataOutput.writeInt(this.sal);
dataOutput.writeInt(this.comm);
}
//反序列化方法:将可跨机器传输数据流(二进制串)转化为java对象的一种技术
public void readFields(DataInput dataInput) throws IOException {
this.empno = dataInput.readInt();
this.ename = dataInput.readUTF();
this.job = dataInput.readUTF();
this.mgr = dataInput.readInt();
this.hiredate = dataInput.readUTF();
this.sal = dataInput.readInt();
this.comm = dataInput.readInt();
}
//其他类通过set/get方法操作变量:Source-->Generator Getters and Setters
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public int getMgr() {
return mgr;
}
public void setMgr(int mgr) {
this.mgr = mgr;
}
public String getHiredate() {
return hiredate;
}
public void setHiredate(String hiredate) {
this.hiredate = hiredate;
}
public int getSal() {
return sal;
}
public void setSal(int sal) {
this.sal = sal;
}
public int getComm() {
return comm;
}
public void setComm(int comm) {
this.comm = comm;
}
}
SalaryTotalMapper.java
package com.wang.employee;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**
* @au