一、概念
全局排序是通过将进入map端之前的数据进行随机采样,在采取的样本中设置分割点,通过分割点将数据进行分区
二、原理
将设置的分割点保存在二叉树中,Map Task 每输出一个数据就会去查找其对应的区间,以此来达到分区效果
三、易忘点
(1)全局排序处理的文件内容key----value按照TAB键分割的(例如k v);
(2)Mapper函数的输入数据类型为Text,Text类型(输出数据类型随意,但需要保证reduce端的输入数据类型与其一致)
(3)主函数中
1,定义分割点的存储路径(例如 String partitionPath="file:/E:/partition" 注意本地路径前要加file:/);
2, 设置InputFormat阶段的格式化类型(job.setInputFormatClass(KeyValueTextInputFormat.class));
3, 设置分区类为全局排序(job.setPartitionerClass(TotalOrderPartitioner.class));
4, 设置分区的分区数,需要与创建随机样本对象传入的分区数相同
job.setNumReduceTasks(3); (3---------为我设置的分区数)
5,获取随机样本对象
RadomSample <Text,Text> sampler =new RandomSample<>(0.1,10,3);
0.1-----------------每个样本被抽到的概率
10------------------样本数
3--------------------分区数
6,设置分割点存储路径
TotalOrderPartitioner.setPartitionFile(job.getConfiguration(),new Path(partitionPath));
7, 添加分割点
InputSampler.writePartitionFile(job,sampler);