MapReduce去重

一:背景

很多数据源中的数据都是含有大量重复的,为此我们需要将重复的数据去掉,这也称为数据的清洗,MapReduce从Map端到Reduce端的Shuffle过程天生就有去重的功能,但是这是对输出的Key作为参照进行去重的。所以我们可以将Map端读入Value作为Key输出,就可以很方便的实现去重了。

二:技术实现

#需求 有两个文件file0和file1。将两个文件中的内容合并去重。

#file0的内容如下:

[java] view plain copy

  1. 1
  2. 1
  3. 2
  4. 2
  5. 3
  6. 3
  7. 4
  8. 4
  9. 5
  10. 5
  11. 6
  12. 6
  13. 7
  14. 8
  15. 9

file1的内容如下:

[java] view plain copy

  1. 1
  2. 9
  3. 9
  4. 8
  5. 8
  6. 7
  7. 7
  8. 6
  9. 6
  10. 5
  11. 5
  12. 4
  13. 4
  14. 2
  15. 1
  16. 2

代码实现:

[java] view plain copy

  1. public class DistinctTest {
  2. // 定义输入路径
  3. private static final String INPUT_PATH = "hdfs://liaozhongmin:9000/distinct_file/*";
  4. // 定义输出路径
  5. private static final String OUT_PATH = "hdfs://liaozhongmin:9000/out";
  6. public static void main(String[] args) {
  7. try {
  8. // 创建配置信息
  9. Configuration conf = new Configuration();
  10. // 创建文件系统
  11. FileSystem fileSystem = FileSystem.get(new URI(OUT_PATH), conf);
  12. // 如果输出目录存在,我们就删除
  13. if (fileSystem.exists(new Path(OUT_PATH))) {
  14. fileSystem.delete(new Path(OUT_PATH), true);
  15. }
  16. // 创建任务
  17. Job job = new Job(conf, DistinctTest.class.getName());
  18. //1.1   设置输入目录和设置输入数据格式化的类
  19. FileInputFormat.setInputPaths(job, INPUT_PATH);
  20. job.setInputFormatClass(TextInputFormat.class);
  21. //1.2   设置自定义Mapper类和设置map函数输出数据的key和value的类型
  22. job.setMapperClass(DistinctMapper.class);
  23. job.setMapOutputKeyClass(Text.class);
  24. job.setMapOutputValueClass(Text.class);
  25. //1.3   设置分区和reduce数量(reduce的数量,和分区的数量对应,因为分区为一个,所以reduce的数量也是一个)
  26. job.setPartitionerClass(HashPartitioner.class);
  27. job.setNumReduceTasks(1);
  28. //1.4   排序
  29. //1.5   归约
  30. job.setCombinerClass(DistinctReducer.class);
  31. //2.1   Shuffle把数据从Map端拷贝到Reduce端。
  32. //2.2   指定Reducer类和输出key和value的类型
  33. job.setReducerClass(DistinctReducer.class);
  34. job.setOutputKeyClass(Text.class);
  35. job.setOutputValueClass(Text.class);
  36. //2.3   指定输出的路径和设置输出的格式化类
  37. FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
  38. job.setOutputFormatClass(TextOutputFormat.class);
  39. // 提交作业 退出
  40. System.exit(job.waitForCompletion(true) ? 0 : 1);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. public static class DistinctMapper extends Mapper<LongWritable, Text, Text, Text>{
  46. //定义写出去的key和value
  47. private Text outKey = new Text();
  48. private Text outValue = new Text("");
  49. @Override
  50. protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, Text>.Context context) throws IOException, InterruptedException {
  51. //把输入的key作为value输出(因为)
  52. outKey = value;
  53. //把结果写出去
  54. context.write(outKey, outValue);
  55. }
  56. }
  57. public static class DistinctReducer extends Reducer<Text, Text, Text, Text>{
  58. @Override
  59. protected void reduce(Text key, Iterable<Text> value, Reducer<Text, Text, Text, Text>.Context context) throws IOException, InterruptedException {
  60. //直接把key写出去
  61. context.write(key, new Text(""));
  62. }
  63. }
  64. }

程序运行的结果:

时间: 2024-09-30 04:17:16

MapReduce去重的相关文章

零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce

此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为hadoop1.X.hadoop2.X,并且还有hadoop生态系统.这里只能慢慢介绍了.一口也吃不成胖子. hadoop 1.x分为mapreduce与hdfs 其中mapreduce是很多人都需要迈过去的槛,它比较难以理解,我们有时候即使写出了mapreduce程序,但是还是摸不着头脑.我们不知道ke

零基础学习hadoop到上手工作线路指导(编程篇)

问题导读:1.hadoop编程需要哪些基础?2.hadoop编程需要注意哪些问题?3.如何创建mapreduce程序及其包含几部分?4.如何远程连接eclipse,可能会遇到什么问题?5.如何编译hadoop源码? 阅读此篇文章,需要些基础下面两篇文章零基础学习hadoop到上手工作线路指导(初级篇) 零基础学习hadoop到上手工作线路指导(中级篇)如果看过的话,看这篇不成问题,此篇讲hadoop编程篇. hadoop编程,hadoop是一个Java框架,同时也是编程的一次革命,使得传统开发运

零基础学习hadoop到上手工作线路指导(中级篇)

此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为hadoop1.X.hadoop2.X,并且还有hadoop生态系统.这里只能慢慢介绍了.一口也吃不成胖子. hadoop 1.x分为 mapreduce与hdfs其中mapreduce是很多人都需要迈过去的槛,它比较难以理解,我们有时候即使写出了mapreduce程序,但是还是摸不着头脑. 我们不知

hadoop1.0.3学习笔记

回 到 目 录 最近要从网上抓取数据下来,然后hadoop来做存储和分析.每晚尽量更新 呆毛王赛高 月子酱赛高 小唯酱赛高 目录 安装hadoop1.0.3 HDFS wordcount mapreduce去重 mapreduce算平均分 mapreduce排序 安装hadoop1.0.3 1 ubuntu中安装hadoop 1.0.3 2 ------------伪分布式安装------------- 3 1.安装ssh 4 sudo apt-get install openssh-serve

零基础学习hadoop到上手工作线路指导

问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如何编译hadoop源码? 阅读此篇文章,需要些基础下面两篇文章 零基础学习hadoop到上手工作线路指导(初级篇) http://www.aboutyun.com/thread-6780-1-1.html 零基础学习hadoop到上手工作线路指导(中级篇) http://www.aboutyun.c

ServerSAN解析(二):Nutanix实现存储与计算资源集成

Nutanix是一套分布式存储系统,在物理节点上集成了存储和计算资源,但逻辑上计算存储融合平台将所有存储逻辑运行在一个预先封装好的虚拟机(存储控制虚拟机)中,该虚拟机在Hypervisor之上运行,与业务计算虚拟机隔离,并为业务虚拟机提供高性能存储服务. Nutanix存储基础设施(NX系列超融合系统)的扩展不受任何管理程序的限制,可以扩展到上千个节点,存储逻辑与虚拟化平台分离,实现了计算和存储故障域隔离.独立的故障域使得平台更加稳定,更适合IO密集或者可靠性要求高的应用场景. 存储虚拟机和计算

利用MapReduce实现数据去重

数据去重主要是为了利用并行化的思想对数据进行有意义的筛选. 统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. 示例文件内容: 此处应有示例文件 设计思路 数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次. 自然就想到将同一数据的所有记录都交给一台reduce机器,无路这个数据出现多少次,只要在最终结果中输出一次就可以了. 具体就是reduce的输入应该以数据作为key,而对value-list没有要求. 当reduce收到一个

Hadoop阅读笔记(二)——利用MapReduce求平均数和去重

前言:圣诞节来了,我怎么能虚度光阴呢?!依稀记得,那一年,大家互赠贺卡,短短几行字,字字融化在心里:那一年,大家在水果市场,寻找那些最能代表自己心意的苹果香蕉梨,摸着冰冷的水果外皮,内心早已滚烫.这一年……我在博客园-_-#,希望用dt的代码燃烧脑细胞,温暖小心窝. 上篇<Hadoop阅读笔记(一)——强大的MapReduce>主要介绍了MapReduce的在大数据集上处理的优势以及运行机制,通过专利数据编写Demo加深了对于MapReduce中输入输出数据结构的细节理解.有了理论上的指导,仍

用一个MapReduce job实现去重,多目录输出功能

总结之前工作中遇到的一个问题. 背景: 运维用scribe从apache服务器推送过来的日志有重复记录,所以这边的ETL处理要去重,还有个需求是要按业务类型多目录输出,方便挂分区,后面的使用. 这两个需求单独处理都没有问题,但要在一个mapreduce里完成,需要一点技巧. 1.map输入数据,经过一系列处理,输出时: if(ttype.equals("other")){ file = (result.toString().hashCode() & 0x7FFFFFFF)%40