在自定义排序上:http://blog.csdn.net/fln250/article/details/23731251,进行了分组,并实现最小值
首先,我们需要在配置完map,添加:job.setGroupingComparatorClass(MyGroupingComparator.class) //设置分组的java类;
MyGroupingComparator.class:
主要是将默认的两个比较方法进行重写,然后传到底层,根据返回的值,判断是否在一组,如果相同则在一组
MyReducer.class
通过打擂的算法,得出最小值打印
MyReducer
static class MyReducer extends Reducer<NewK2, LongWritable, LongWritable, LongWritable>{
protected void reduce(NewK2 k2, java.lang.Iterable<LongWritable> v2s, org.apache.hadoop.mapreduce.Reducer<NewK2,LongWritable,LongWritable,LongWritable>.Context context) throws java.io.IOException ,InterruptedException {
long min = Long.MAX_VALUE;
for (LongWritable v2 : v2s) {
if(v2.get()<min){
min = v2.get();
}
}
context.write(new LongWritable(k2.first), new LongWritable(min));
};
}
MyGroupingComparator
/**
* 分组的目的:例如:要在相同的key中,找出最小的值
* 把key相同的value放在一个集合----->即需要将key分组,但是NewK是对象,默认分组是比较里面的属性是否全部相同,全部相同就放在一组中,但是这样我们求最小值,有什么意义!
* 于是,我们只是比较对象中的某个值,如first
* @author Administrator
*
*/
static class MyGroupingComparator implements RawComparator<NewK>{
/**
* 通过对象分组
*/
@Override
public int compare(NewK o1, NewK o2) {
// TODO Auto-generated method stub
return (int)(o1.first-o2.first);
}
/**
* 通过对象的字节数组进行排序
*/
/**
* @param arg0 表示第一个参与比较的字节数组
* @param arg1 表示第一个参与比较的字节数组的起始位置
* @param arg2 表示第一个参与比较的字节数组的偏移量
*
* @param arg3 表示第二个参与比较的字节数组
* @param arg4 表示第二个参与比较的字节数组的起始位置
* @param arg5 表示第二个参与比较的字节数组的偏移量
*/
@Override
public int compare(byte[] arg0, int arg1, int arg2, byte[] arg3,
int arg4, int arg5) {
// TODO Auto-generated method stub
/*
* 清楚我们的目的,是要比较NewK中的first,
* 1.first和second,first的字节在前
* 2.他们都是long,字节为8
* 3.起始为:0,数组偏移量:8,那么刚好可以比较出first
*/
return WritableComparator.compareBytes(arg0, arg1,8, arg3, arg4,8);
}
}