import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
/* 测试 Partitioner 分区
*/
public class TestPartitioner extends Partitioner<Text, Text>{
/*
* 接受的两个是应该是输入的<key value> 的数据类型 然后根据传进来的 的key 应该有三种结果long right short 然后进行区分输出文件
*/
@Override
public int getPartition(Text key, Text value, int numPartition) {
/*
* numPartition = job.setNumReduceTasks(3); 在运行类设置
* numPartition 分多少个reduce 或者分多少个 文件数量
* 如果是伪分布式 出来的文件 也只有一个而已 因为 他无法设置 reduce的数量 要么一个 要么 0个reduce
* 但是输出的文件是排序了的
*/
int result = 0;
if(key.equals("long")){
result = 0 % numPartition; //part-r-00000 输出到的文件
} else if (key.equals("short")){
result = 1 % numPartition; //part-r-00001
} else if (key.equals("right")){
result = 2 % numPartition; //part-r-00002
}
return result;
}
}
这里建立的基础是
有数据 如同下面
mrwang 11 huai 13 14 ting 66 77 xiaowang 77 88 99
其中 第一行 只有两列数据
第四行 有四列数据
而我们希望只计算三列数据的
于是我们就可以用 Partitioner 进行区分数据 或者区分文件
他是通过在map阶段输入数据并且 通过指定某个reduce 去达到 分区的效果的
默认使用的是 HashPartitioner
job.setPartitionerClass() 应该是可以通过这样去使用partitioner
本文出自 “某人说我技术宅” 博客,请务必保留此出处http://1992mrwang.blog.51cto.com/3265935/1206346