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.代码实现:
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文件创建好,输出目录不用创建。附加结果截图: