分区的目的
把不同数据输出到不同reduceTask 最终到输出不同文件中
分区概念
数据的分发到不同reducer /不同文件
就是数据发送到多个目的地规则
hadoop 的默认分区原则
默认规则是: hashpartitioner
按照key的hashCode % reduceTask 数量 = 分区号
默认reduceTask 数量为1,当然也可以在driver 端进行设置
以下是Partition 类中源码
hadoop 的分区作用位置
mapTask 输出先到收集器,收集器数据写入环形缓冲区前先进行分区
自定义partitioner实现
分区号是从0开始的,自定义的时候返回分区号码也必须是从0开始的
public class ProvincePartitioner extends Partitioner<Text, FlowBean> {
@Override
public int getPartition(Text key, FlowBean value, int numPartitions) {
// 1 获取电话号码的前三位
String preNum = key.toString().substring(0, 3);
int partition = 4;
// 2 判断是哪个省
if ("136".equals(preNum)) {
partition = 0;
}else if ("137".equals(preNum)) {
partition = 1;
}else if ("138".equals(preNum)) {
partition = 2;
}else if ("139".equals(preNum)) {
partition = 3;
}
return partition;
}
}
注意事项
要把不同的分区输出不同文件还要设置reduceTask 数量和分区数量一致才能达到效果
如果reduceTask 数量=1, 分区数!=1, 分区过程是不执行的,
因为底层代码,先判断reducetask !=1 才开始分区
版权声明:本文为weixin_43548518原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。