版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31246691/article/details/82156385
MapReduce的Reduce阶段的分组是按照Map阶段输出的Key来进行的,也就是Key相同就会分发到同一个Reduce中。但是今天在写一个推荐系统时遇到了这样的需求:
Map阶段输出的Key是我自定义的MyKey,它有两个字段:用户ID和其对应的推荐系数,现在有100个商品对于用户user1的推荐系数,如下:
<user1,1.0>
<user1,3.0>
<user1,2.0>
......
而在reduce阶段需要提取出推荐系数最高的前十个,所以就需要将用户ID相同的分发到同一个Reduce中,这时候就需要用到GroupingComparatorClass。下面的代码即我实现的GroupingComparatorClass。
class UserGroup extends WritableComparator{
public UserGroup(){
super(MyKey.class,true);
}
public int compare(WritableComparable a, WritableComparable b) {
MyKey o1 =(MyKey) a;
MyKey o2 =(MyKey) b;
return o1.getUid().compareTo(o2.getUid());
}
}
其中,getUid(是获取用户ID的方法),这样就可以将用户ID相同的分到同一个Reduce。
(注意:默认的构造方法必须有)