虽然在MR运行的时候回以key为核心进行分组操作,但是有时候我们需要自定义分组来实现一些特别的功能,下面我给大家准备了一个自定义分组的简单例子,希望可以帮到大家
package com.wy;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
public class OrderGroup extends WritableComparator {
/**
* 这个构造器的格式必须怎么写,不要改变
* 其中第一个参数是MapReducer运行时的key
* 第二个是指是否使用这个类,一般都是true
*/
public OrderGroup() {
super(OrderBean.class,true);
}
/**
* 在这个方法中书写共性条件
* 结果的逻辑和一般的排序方法同理
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
OrderBean oa= (OrderBean) a;
OrderBean ob= (OrderBean) b;
return oa.getUid().compareTo(ob.getUid());
}
}
之后千万不要忘了在Driver哪里设置
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration cfg = new Configuration() ;
//获取到任务
Job job = Job.getInstance(cfg) ;
job.setJarByClass(OrderDriver.class);
//设置map reduce类
job.setMapperClass(OrderMapper.class);
job.setReducerClass(OrderReduce.class);
//设置自定义分组类
job.setGroupingComparatorClass(OrderGroup.class);
//对输入输出参数设置
// Text, IntWritable
job.setOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class);
job.setMapOutputKeyClass(OrderBean.class);
job.setMapOutputValueClass(NullWritable.class);
//设置输入输出路径
FileInputFormat.setInputPaths(job,new Path("D:\\a\\inputorder"));
FileOutputFormat.setOutputPath(job, new Path("D:\\a\\outputorder"));
boolean b = job.waitForCompletion(true);
System.exit( b== true?0:-1);
}