Partition分区用于将结果按条件输出到不同文件或者分区中。(分区是在mapper后reduce前)
默认分区
在这里插入图片描述
用户不能通过默认分区控制key存储到哪个分区。

自定义分区
步骤:
(1)自定义类继承Partitioner,重写getPartition()方法。

public class CustomPartitioner extends Partitioner<Text,FlowBean>
{
    @Override
    public int getPartition(Text key, FlowBean value, int numPartitions)
    {
        //控制分区代码逻辑
        ...
        return partition;            
    }
}

(2)在job驱动中设置自定义Partitioner。

job.setPartitionerClass(CustomPartitioner.class);

(3)自定义Partition后,根据自定义的逻辑设置相应数量的ReduceTask。不设置时默认为1,则使用默认分区。

job.setNumReduceTask(5);

总结

(1)如果ReduceTask的数量 > getPartition的结果数,则会多产生几个空文件。

(2)如果 1 < ReduceTask的数量 < getPartition的结果数,则有部分分区数据无处存储,会抛出IO异常。

(3)如果ReduceTask的数量==1,则不管MapTask端输出多少分区文件,最终结果都交给一个 ReduceTask,即使用默认分区,只产生一个结果文件。

(4)分区号必须从0开始,逐一增加。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐