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