MapReduce分区-代码实现

自定义 Partitioner

主要的逻辑就在这里, 这也是这个案例的意义, 通过 Partitioner 将数据分发给不同的Reducer

/**
* 这里的输入类型与我们map阶段的输出类型相同
*/
public class MyPartitioner extends Partitioner<Text,NullWritable>{

	/**
	* 返回值表示我们的数据要去到哪个分区
	* 返回值只是一个分区的标记,标记所有相同的数据去到指定的分区
	*/
	@Override
	public int getPartition(Text text, NullWritable nullWritable, int i){
	
		String result = text.toString().split("\t")[5];		
		
		System.out.println(result);
		
		if (Integer.parseInt(result) > 15){
			return 1;
		}else{
			return 0;
		}
	}
}

Main 入口

public class PartitionMain extends Configured implements Tool {

	public static void main(String[] args) throws Exception{
		int run = ToolRunner.run(new Configuration(), new
		PartitionMain(), args);
		System.exit(run);
	}
	
	@Override
	public int run(String[] args) throws Exception {
		Job job = Job.getInstance(super.getConf(),
		PartitionMain.class.getSimpleName());
		job.setJarByClass(PartitionMain.class);
		job.setInputFormatClass(TextInputFormat.class);
		job.setOutputFormatClass(TextOutputFormat.class);
		TextInputFormat.addInputPath(job,new
		Path("hdfs://192.168.52.250:8020/partitioner"));
		TextOutputFormat.setOutputPath(job,new
		Path("hdfs://192.168.52.250:8020/outpartition"));
		job.setMapperClass(MyMapper.class);
		job.setMapOutputKeyClass(Text.class);
		job.setMapOutputValueClass(NullWritable.class);
		job.setOutputKeyClass(Text.class);
		job.setMapOutputValueClass(NullWritable.class);
		job.setReducerClass(MyReducer.class);
		/**
		* 设置我们的分区类,以及我们的reducetask的个数,注意reduceTask的个数
		一定要与我们的
		* 分区数保持一致
		*/
		job.setPartitionerClass(MyPartitioner.class);
		job.setNumReduceTasks(2);
		boolean b = job.waitForCompletion(true);
		return b?0:1;
	}
	
}
发布了2209 篇原创文章 · 获赞 50 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/104546613