MapReduce去重
来源:互联网 发布:沧州优仕教育网络论坛 编辑:程序博客网 时间:2024/05/01 14:31
一:背景
很多数据源中的数据都是含有大量重复的,为此我们需要将重复的数据去掉,这也称为数据的清洗,MapReduce从Map端到Reduce端的Shuffle过程天生就有去重的功能,但是这是对输出的Key作为参照进行去重的。所以我们可以将Map端读入Value作为Key输出,就可以很方便的实现去重了。
二:技术实现
#需求 有两个文件file0和file1。将两个文件中的内容合并去重。
#file0的内容如下:
112233445566789file1的内容如下:
1998877665544212
代码实现:
public class DistinctTest {// 定义输入路径private static final String INPUT_PATH = "hdfs://liaozhongmin:9000/distinct_file/*";// 定义输出路径private static final String OUT_PATH = "hdfs://liaozhongmin:9000/out";public static void main(String[] args) {try {// 创建配置信息Configuration conf = new Configuration();// 创建文件系统FileSystem fileSystem = FileSystem.get(new URI(OUT_PATH), conf);// 如果输出目录存在,我们就删除if (fileSystem.exists(new Path(OUT_PATH))) {fileSystem.delete(new Path(OUT_PATH), true);}// 创建任务Job job = new Job(conf, DistinctTest.class.getName());//1.1设置输入目录和设置输入数据格式化的类FileInputFormat.setInputPaths(job, INPUT_PATH);job.setInputFormatClass(TextInputFormat.class);//1.2设置自定义Mapper类和设置map函数输出数据的key和value的类型job.setMapperClass(DistinctMapper.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(Text.class);//1.3设置分区和reduce数量(reduce的数量,和分区的数量对应,因为分区为一个,所以reduce的数量也是一个)job.setPartitionerClass(HashPartitioner.class);job.setNumReduceTasks(1);//1.4排序//1.5归约job.setCombinerClass(DistinctReducer.class);//2.1Shuffle把数据从Map端拷贝到Reduce端。//2.2指定Reducer类和输出key和value的类型job.setReducerClass(DistinctReducer.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(Text.class);//2.3指定输出的路径和设置输出的格式化类FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));job.setOutputFormatClass(TextOutputFormat.class);// 提交作业 退出System.exit(job.waitForCompletion(true) ? 0 : 1);} catch (Exception e) {e.printStackTrace();}}public static class DistinctMapper extends Mapper<LongWritable, Text, Text, Text>{//定义写出去的key和valueprivate Text outKey = new Text();private Text outValue = new Text("");@Overrideprotected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException {//把输入的key作为value输出(因为)outKey = value;//把结果写出去context.write(outKey, outValue);}}public static class DistinctReducer extends Reducer<Text, Text, Text, Text>{@Overrideprotected void reduce(Text key, Iterable<Text> value, Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {//直接把key写出去context.write(key, new Text(""));}}}程序运行的结果:
0 0
- MapReduce去重
- mapreduce去重
- hadoop mapreduce数据去重
- MapReduce 之 数据去重
- MapReduce实例----数据去重
- 【MapReduce实例】数据去重
- MapReduce数据去重程序实验
- MongoDB--MapReduce分组去重用法
- MapReduce编程之数据去重
- MapReduce编程实例之数据去重
- Hadoop MapReduce数据去重程序
- MapReduce之去重计数类应用
- MapReduce--5--单词去重WordDistinctMR
- Hadoop mapreduce 数据去重 数据排序小例子
- Hadoop MapReduce应用案例——数据去重
- MapReduce处理数据去重与数据排序
- 编写mapreduce程序实例——数据去重
- MapReduce基础开发之二数据去重和排序
- 大的得瑟大概色
- poj 2728(Desert King) 最优比例生成树 (分数规划)
- imageNamed与imageWithContentsOfFile加载图片的区别
- 关于单例类模板析构的问题
- 黑马程序员_java01_多线程
- MapReduce去重
- 关于单片机中断模块的心得体会
- 外键和级联
- 一大波资源来袭:工具,源码,职场攻略
- win7 局域网内消息发送命令msg
- [暖手][学习阶段-各路杂题][HDU-1012]u Calculate e
- 3110: 精明的采购员John
- [Leetcode]3Sum
- ACCESS数据库连接字符串