您当前的位置: 首页 >  ar

29 MAPREDUCE中的分区Partitioner

杨林伟 发布时间:2019-08-08 10:47:33 ,浏览量:3

需求

根据归属地输出流量统计数据结果到不同文件,以便于在查询统计结果时可以定位到省级范围进行。

分析

Mapreduce中会将map输出的kv对,按照相同key分组,然后分发给不同的reducetask。

默认的分发规则为:根据key的hashcode%reducetask数来分发。

所以:如果要按照我们自己的需求进行分组,则需要改写数据分发(分组)组件Partitioner

自定义一个CustomPartitioner继承抽象类:Partitioner然后在job对象中,设置自定义partitioner: job.setPartitionerClass(CustomPartitioner.class)

实现
/**
 * 定义自己的从map到reduce之间的数据(分组)分发规则 按照手机号所属的省份来分发(分组)ProvincePartitioner
 * 默认的分组组件是HashPartitioner
 * 
 * @author
 * 
 */
public class ProvincePartitioner extends Partitioner {

	static HashMap provinceMap = new HashMap();

	static {

		provinceMap.put("135", 0);
		provinceMap.put("136", 1);
		provinceMap.put("137", 2);
		provinceMap.put("138", 3);
		provinceMap.put("139", 4);

	}

	@Override
	public int getPartition(Text key, FlowBean value, int numPartitions) {

		Integer code = provinceMap.get(key.toString().substring(0, 3));

		return code == null ? 5 : code;
	}

}
关注
打赏
1688896170
查看更多评论

杨林伟

暂无认证

  • 3浏览

    0关注

    3183博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.0703s