mapreduce中二次排序的思想中,我们常常需要对数据的分区分组进行自定义,
以下就介绍一下自定义分区分组的简单实现
1、自定义分区:
public class demoPartitioner<K, V> extends Partitioner<K, V>{
@Override
//注意有几个分区reduce任务就有几个
public int getPartition(K key, V value, int numPartitions) {
String op=key.toString();
switch(op)
{
case "张村":return 0;
case "李村":return 1;
case "王村":return 2;
case "赵村":return 3;
}
return 4;
}
}
要注意的是:设置了分区之后,reduce任务的个数就只能设置和分区数量一样的个数了!!
2、自定义分组:
class demoGroup implements RawComparator<CombineKey> {
public int compare(Object o1, Object o2) {
return 0;
}
/**
* b1 第一个参与比较的字节数组
* s1 第一个字节数组中开始比较的位置
* l1 第一个字节数组参与比较的长度
* b2 第二个参与比较的字节数组
* s2 第二个字节数组中开始比较的位置
* l2 第二个字节数组参与比较的长度
*/
public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {
return WritableComparator.compareBytes(b1, s1, 1, b2, s2, 1);
}
}
3、场景模拟:对于二次排序的思想
当出现以下需求
A 1 1 A 1 1
B 2 3 》》 A 2 0
A 2 0 B 2 3
这个时候可以让A1、A2、B2这三个当做key来排序,
实现排序功能,但这个时候A1,A2不应该在不同的分区或者组内
显然A、B应为分区,分组的条件,这时候就需要自定义分区和分组了