▶ \blacktriangleright ▶ 分区
- 代码
/**
*建一个Partition类继承Partitioner,重写getPartition方法
*/
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
public class FlowKeyPartition extends Partitioner<FlowBean, Text> {
//写入多个文件
@Override
public int getPartition(FlowBean flowBean, Text text, int i) {
//按照电话号码的号段进行分区 136的放入一个文件,137一个,138一个,其他所有号段放到另一个分区
String substring = text.toString().substring(0,3);//范围左闭右开
if("136".equals(substring)){
return 0;//return 几 就返回几就进入到几分区
}
if("137".equals(substring)){
return 1;//return 几 就返回几就进入到几分区
}
if("138".equals(substring)){
return 2;//return 几 就返回几就进入到几分区
}
return 3;
}
}
/**
*Driver类中添加如下代码
*/
job.setPartitionerClass(FlowKeyPartition.class);//说明要用自己的分区,不用默认的
job.setNumReduceTasks(4);//控制生成几个文件
-
分区实在Map阶段的context.write()方法是调用的HashPartition,检验几个分区
-
练习:wordCount按照ASCII码的奇偶数进行分区
-
代码:Partition类
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;
public class WordCountOrderPartition extends Partitioner<Text, IntWritable> {
@Override
public int getPartition(Text text, IntWritable intWritable, int i) {
String s = text.toString();
// String substring = s.substring(1);
char[] chars = s.toCharArray();
int aChar = chars[0];
System.out.println("chars[0] = " + chars[0]);
System.out.println("aChar = " + aChar);
if(aChar%2==1){
return 1;
}
return 0;
}
}