hadoop的分组

1 创建分区类

public class AreaPartitioner<KEY, VALUE> extends Partitioner<KEY, VALUE> {

    private static HashMap<String, Integer> areaMap = new HashMap<String, Integer>();   
    static {
        areaMap.put("136", 0);
        areaMap.put("137", 1);
        areaMap.put("138", 2);
        areaMap.put("139", 3);
    }
    //这里接受到Reducer context.write(key, value), 在这里进行分区输出key和value进行分组输出到相应的分组文件中
    @Override
    public int getPartition(KEY key, VALUE value, int numPartitions) {
        FlowSortBean bean = (FlowSortBean)key;

        Integer partitionNum = 4;
        if(bean != null && StringUtils.isNotBlank(bean.getPhoneNB())) {         
            String phoneNB = bean.getPhoneNB();         
            Integer prefix = areaMap.get(phoneNB.substring(0, 3));
            partitionNum = prefix != null ? prefix : partitionNum;

        }
        return partitionNum;        
    }

}

2 在启动类中调用分组

    //设置分区接收到Reducer write输出的值,进行分区输出
    job.setPartitionerClass(AreaPartitioner.class);
    //设置了Reducer的分区数目,比如5 YarnChild Instance
    //这里将分成5个文件,索引值: 0-4
    job.setNumReduceTasks(5);//process (or instance)

注意:
1.这里的reduce task 数量,要和AreaPartitioner类返回的getPartition()返回的不同值的数量保持一致
2.如果reducer task数量比patitioner中分组的数量多,会产生空文件。
比如:0-4是有值的,其他都是空文件
3.如果reducer task数量比patitioner中分组的数量少,会产生io异常。
因为有一些key没有对应reducer接收分组文件
reduce task或map task指的是reducer和mapper所在的集群中运行的实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值