1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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; } } |
这里建立的基础是
有数据 如同下面
1 2 3 4 | mrwang 11 huai 13 14 ting 66 77 xiaowang 77 88 99 |
其中 第一行 只有两列数据
第四行 有四列数据
而我们希望只计算三列数据的
于是我们就可以用 Partitioner 进行区分数据 或者区分文件
他是通过在map阶段输入数据并且 通过指定某个reduce 去达到 分区的效果的
默认使用的是 HashPartitioner
job.setPartitionerClass() 应该是可以通过这样去使用partitioner
本文转自 拖鞋崽 51CTO博客,原文链接:http://blog.51cto.com/1992mrwang/1206346