mapreduce的自定义分组

默认分组默认情况下的分组和排序的规则是一样的,他们调用的都是compareTo()方法。排序:compareTo()返回值 调整数据顺序排序规则相同的会排在一起 分组:compareTo()调用的是返回值是否为0返回值为0的为0的全部为一组返回值不为0的为新的组底层实现: 调用一个类 WritableComparetor 是一个普通类/*分组按照map输出的key(序列化...
摘要由CSDN通过智能技术生成

默认分组

默认情况下的分组和排序的规则是一样的,他们调用的都是compareTo()方法。
排序:compareTo()返回值 调整数据顺序
排序规则相同的会排在一起
分组:compareTo()调用的是返回值是否为0
返回值为0的为0的全部为一组
返回值不为0的为新的组
底层实现: 调用一个类 WritableComparetor 是一个普通类

/*
分组按照map输出的key(序列化、比较)
map输出的key肯定是WritableCompareable的子类
*/
  @SuppressWarnings("unchecked")
  public int compare(WritableComparable a, WritableComparable b) {
   //map输出的key的compareTo方法
    return a.compareTo(b);
  }
  默认分组调用的就是 key的compareTo()
 key是默认类型,默认类型 compareTo 方法    比较的是实际的值(数值、Text)
 key是自定义类型,自定义的compareTo方法

自定义分组

1)写一个分组类继承WritableComparator类
2)重写compare方法,重新定义分组算法
3)在job中指定分组类
//指定分组类
job.setGroupingComparatorClass(Group.class);

报错:Caused by: java.lang.NullPointerException	
分组类中有错
默认不会创建compare方法中的参数 WritableComparable 对象的

解决方法:
//重新调用父类的构造方法
		public Group() {
			//调用父类的构造, 第二个参数为true 创建map的key对象  
			super(Stu.class,true);
		}
分组是在排序的基础上进行的,只会比较排序结果的前后相连的数据,不会跳跃比价的
无参构造
protected WritableComparator() {
    this(null);
  }
  /** Construct for a {@link WritableComparable} implementation. 

keyClass------>map的key
null
false 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值