[MapReduce编程案例2-线段重叠统计]

1.数据:每条数据两个值表示线段的起点和重点位置

 目标:统计每个点重叠(至少等于2)的线段个数

思路:

Map任务:映射每条数据经过的所有点位置为key,<key,1>

Reduce任务:累计额相同key的value,大于1的则输出

2.代码

public class Line {

	public static class LineMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable>{
		@Override
		protected void map(LongWritable key, Text value,
				Mapper<LongWritable, Text, IntWritable, IntWritable>.Context context)
				throws IOException, InterruptedException {
			//得到线段左右断点位置(split[0],split[1])
			String[] split = value.toString().split(",");
			for(int i=Integer.parseInt(split[0]);i<=Integer.parseInt(split[1]);i++){
				context.write(new IntWritable(i), new IntWritable(1));
			}
		}
	}
	public static class LineReducer extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>{
		@Override
		protected void reduce(IntWritable key, Iterable<IntWritable> values,
				Reducer<IntWritable, IntWritable, IntWritable, IntWritable>.Context context)
				throws IOException, InterruptedException {
			int count=0;
			for (IntWritable v : values) {
				count+=v.get();
			}
			//有重叠(count>=2)才输出
			if(count>1){
				context.write(key, new IntWritable(count));
			}
		}
	}
	public static void main(String[] args) throws Exception {
		System.setProperty("HADOOP_USER_NAME", "root");
		
		Configuration conf = new Configuration();
		conf.set("mapreduce.framework.name", "yarn");
		conf.set("fs.defaultFS", "hdfs://hdp-nn-01:9000/");
		Job job = Job.getInstance();
		
		job.setJarByClass(Line.class);
		
		job.setMapperClass(LineMapper.class);
		job.setReducerClass(LineReducer.class);
		
		//map输出的keyvalue类型必须设置,否则mr框架会默认认为map产生key时LongWritable类型
		job.setMapOutputKeyClass(IntWritable.class);
		job.setMapOutputValueClass(IntWritable.class);
		
		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(IntWritable.class);
		
		FileInputFormat.setInputPaths(job, new Path("/mrdata/line/input"));
		FileOutputFormat.setOutputPath(job, new Path("/mrdata/line/output"));
		
		boolean res = job.waitForCompletion(true);
		System.exit(res?0:1);
	}
}

3.结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值