mapreduce自定义分组、自定义分区、二次排序

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应为分区,分组的条件,这时候就需要自定义分区和分组了

猜你喜欢

转载自blog.csdn.net/qq_40757296/article/details/83187821
今日推荐