MapReduce实例一之数据去重

1、数据去重

"数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重。下面就进入这个实例的MapReduce程序设计。

1.1 实例描述

对数据文件中的数据进行去重。数据文件中的每行都是一个数据。

样例输入如下所示:
file1:

2012-3-1 a
2012-3-2 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-7 c
2012-3-3 c

file2:

2012-3-1 b
2012-3-2 a
2012-3-3 b
2012-3-4 d
2012-3-5 a
2012-3-6 c
2012-3-7 d
2012-3-3 c

样例输出如下所示:
result:

2012-3-1 a
2012-3-1 b
2012-3-2 a
2012-3-2 b
2012-3-3 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-6 c
2012-3-7 c
2012-3-7 d

2.设计思路

map一行一行的读取数据,行号->这一行的数据(K->V)作为输入键值对,这个map输入时的V作为输出时的key传给reduce,map输出时的value不用管随意设置即可,在将键值对数据传给reduce处理的时候,相同key的键值对会将value合并为value-list而key不变,然后在分配给不同的reduce机器,而reduce处理时不用管value-list,直接将输入时的key,作为输出时的key写出即可。

表达有限,实在看不懂可以结合代码就明白了。

3.代码实现:

扫描二维码关注公众号,回复: 10999229 查看本文章
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Mapper.Context;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;

public class MRDemo02 {
	//定义map
	public static class Map extends Mapper<Object, Text, Text, Text>{
		
		private static Text line = new Text();
		
		public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
			line = value; //value值为每一行的数据
			context.write(line, new Text("")); //将每一行的数据作为key输出
		}
		
	}
	//定义reduce
	public static class Reduce extends Reducer<Text, Text, Text, Text>{
		
		public void reduce(Text key, Iterable<Text> value, Context context) throws IOException, InterruptedException {
			context.write(key, new Text("")); //此时的value不用管,只需将传进来的key作为输出时的key输出即可
		}
		
	}
	
	
	public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
		Configuration conf = new Configuration();

		Job job = Job.getInstance(conf, "MRDemo02");

		job.setJarByClass(MRDemo02.class);
		
		job.setMapperClass(Map.class);
		job.setCombinerClass(Reduce.class);
		job.setReducerClass(Reduce.class);
		
		job.setOutputKeyClass(Text.class);
		job.setOutputValueClass(Text.class);
		
		FileInputFormat.addInputPath(job, new Path("/user/az/dedup_in")); //设置输入目录
		FileOutputFormat.setOutputPath(job, new Path("/user/az/dedup_out")); //设置输出目录
		
		job.waitForCompletion(true);
	}
	
}

4.打成jar包

如果不会打包参考博客:https://blog.csdn.net/qq_43437122/article/details/105343870

将文件打成jar包上传的hadoop环境下测试。你要先将输入目录及file1和file2文件创建好,输出目录不用创建。附加结果截图:

在这里插入图片描述

发布了80 篇原创文章 · 获赞 69 · 访问量 8930

猜你喜欢

转载自blog.csdn.net/qq_43437122/article/details/105387940