本文共 1038 字,大约阅读时间需要 3 分钟。
mapreduce中二次排序的思想中,我们常常需要对数据的分区分组进行自定义,
以下就介绍一下自定义分区分组的简单实现
1、自定义分区:
public class demoPartitionerextends Partitioner { @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{ 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应为分区,分组的条件,这时候就需要自定义分区和分组了
转载地址:http://dpahn.baihongyu.com/