版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
目录
一、外部比较器实现
需要注意,这里的比较是对MapReduce中key类型的比较,并且key的类型为InWritable类型。
1、自定义比较器继承WritableComparator类
package com.gxwz.utils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
/**
* TODO IntWritable类的倒叙排序
* @author administrator
* @Date 2019年10月7日
*/
public class IntWritableComparator extends WritableComparator {
/*
* 重写构造方法,定义比较类 IntWritable
*/
public IntWritableComparator() {
super(IntWritable.class, true);
}
/*
* 重写compare方法,自定义比较规则
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
//向下转型
IntWritable ia = (IntWritable) a;
IntWritable ib = (IntWritable) b;
return ib.compareTo(ia);
}
}
2、job设置比较器
//Job job = Job.getInstance(conf, "DescSort");
job.setSortComparatorClass(IntWritableComparator.class);
二、自定义序列化比较器实现
1、自定义序列化类,实现WritableComparable接口
package com.gxwz.entity;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
/**
* TODO 各地区年收入信息
* @author com
* @Date 2019年10月3日
*/
public class AnnualIncome implements WritableComparable<AnnualIncome>{
private String workerId = ""; //id
private String area = ""; //地区
private String date = ""; //时间
private String amount = ""; //收入
public String getWorkerId() {
return workerId;
}
public void setWorkerId(String workerId) {
this.workerId = workerId;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
@Override
public String toString() {
return workerId + "\t" + area + "\t" + date + "\t" + amount;
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(workerId);
out.writeUTF(area);
out.writeUTF(date);
out.writeUTF(amount);
}
@Override
public void readFields(DataInput in) throws IOException {
this.workerId = in.readUTF();
this.area = in.readUTF();
this.date = in.readUTF();
this.amount = in.readUTF();
}
@Override
public int compareTo(AnnualIncome o) {
return this.workerId.compareTo(o.workerId);
}
}