数据去重:

原理(理解):Mapreduce程序首先应该确认<k3,v3>,根据<k3,v3>确定<k2,v2>,原始数据中出现次数超过一次的数据在输出文件中只出现一次。Reduce的输出是不重复的数据,也就是每一行数据作为key,即k3。而v3为空或不需要设值。根据<k3,v3>得到k2为每一行的数据,v2为空。根据MapReduce框架设值可知,k1为每行的起始位置,v1为每行的内容。因此,v1需要赋值给k2,使得原来的v1作为新的k2,从而两个或更多文件通过在Reduce端聚合,得到去重后的数据。

 数据:

file1.txt

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

file2.txt

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

*创建文件夹dedup_in并创建上述两文件,将该文件夹上传到HDFS中

[root@neusoft-master filecontent]# hadoop dfs -put dedup_in/ /neusoft/

[root@neusoft-master filecontent]# hadoop dfs -ls /neusoft

(1)自定义Mapper任务

  1. private static class MyMapper extends Mapper<Object, Text, Text, Text>{
  2. private static Text line=new Text();
  3. @Override
  4. protected void map(Object k1, Text v1,
  5. Mapper<Object, Text, Text, Text>.Context context)
  6. throws IOException, InterruptedException {
  7. line=v1;//v1为每行数据,赋值给line
  8. context.write(line, new Text(""));
  9. }
  10. }

(2)自定义Reduce任务

  1. private static class MyReducer extends Reducer<Text, Text, Text, Text>
  2. {
  3. @Override
  4. protected void reduce(Text k2, Iterable<Text> v2s,
  5. Reducer<Text, Text, Text, Text>.Context context)
  6. throws IOException, InterruptedException {
  7. context.write(k2, new Text(""));
  8. }
  9. }

(3)主函数(组织map和reduce)

  1. public static void main(String[] args) throws Exception {
  2. //必须要传递的是自定的mapper和reducer的类,输入输出的路径必须指定,输出的类型<k3,v3>必须指定
  3. //2将自定义的MyMapper和MyReducer组装在一起
  4. Configuration conf=new Configuration();
  5. String jobName=DataDeduplication.class.getSimpleName();
  6. //1首先寫job,知道需要conf和jobname在去創建即可
  7. Job job = Job.getInstance(conf, jobName);
  8.  
  9. //*13最后,如果要打包运行改程序,则需要调用如下行
  10. job.setJarByClass(DataDeduplication.class);
  11.  
  12. //3读取HDFS內容:FileInputFormat在mapreduce.lib包下
  13. FileInputFormat.setInputPaths(job, new Path(args[0]));
  14. //4指定解析<k1,v1>的类(谁来解析键值对)
  15. //*指定解析的类可以省略不写,因为设置解析类默认的就是TextInputFormat.class
  16. job.setInputFormatClass(TextInputFormat.class);
  17. //5指定自定义mapper类
  18. job.setMapperClass(MyMapper.class);
  19. //6指定map输出的key2的类型和value2的类型 <k2,v2>
  20. //*下面两步可以省略,当<k3,v3>和<k2,v2>类型一致的时候,<k2,v2>类型可以不指定
  21. job.setMapOutputKeyClass(Text.class);
  22. job.setMapOutputValueClass(Text.class);
  23. //7分区(默认1个),排序,分组,规约 采用 默认
  24. job.setCombinerClass(MyReducer.class);
  25. //接下来采用reduce步骤
  26. //8指定自定义的reduce类
  27. job.setReducerClass(MyReducer.class);
  28. //9指定输出的<k3,v3>类型
  29. job.setOutputKeyClass(Text.class);
  30. job.setOutputValueClass(Text.class);
  31. //10指定输出<K3,V3>的类
  32. //*下面这一步可以省
  33. job.setOutputFormatClass(TextOutputFormat.class);
  34. //11指定输出路径
  35. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  36.  
  37. //12写的mapreduce程序要交给resource manager运行
  38. job.waitForCompletion(true);
  39. }

数据去重源代码:

  1. package Mapreduce;
  2.  
  3. import java.io.IOException;
  4.  
  5. import org.apache.hadoop.conf.Configuration;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.io.Text;
  8. import org.apache.hadoop.mapreduce.Job;
  9. import org.apache.hadoop.mapreduce.Mapper;
  10. import org.apache.hadoop.mapreduce.Reducer;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  13. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  14. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  15.  
  16. public class DataDeduplication {
  17. public static void main(String[] args) throws Exception {
  18. //必须要传递的是自定的mapper和reducer的类,输入输出的路径必须指定,输出的类型<k3,v3>必须指定
  19. //2将自定义的MyMapper和MyReducer组装在一起
  20. Configuration conf=new Configuration();
  21. String jobName=DataDeduplication.class.getSimpleName();
  22. //1首先寫job,知道需要conf和jobname在去創建即可
  23. Job job = Job.getInstance(conf, jobName);
  24.  
  25. //*13最后,如果要打包运行改程序,则需要调用如下行
  26. job.setJarByClass(DataDeduplication.class);
  27.  
  28. //3读取HDFS內容:FileInputFormat在mapreduce.lib包下
  29. FileInputFormat.setInputPaths(job, new Path(args[0]));
  30. //4指定解析<k1,v1>的类(谁来解析键值对)
  31. //*指定解析的类可以省略不写,因为设置解析类默认的就是TextInputFormat.class
  32. job.setInputFormatClass(TextInputFormat.class);
  33. //5指定自定义mapper类
  34. job.setMapperClass(MyMapper.class);
  35. //6指定map输出的key2的类型和value2的类型 <k2,v2>
  36. //*下面两步可以省略,当<k3,v3>和<k2,v2>类型一致的时候,<k2,v2>类型可以不指定
  37. job.setMapOutputKeyClass(Text.class);
  38. job.setMapOutputValueClass(Text.class);
  39. //7分区(默认1个),排序,分组,规约 采用 默认
  40. job.setCombinerClass(MyReducer.class);
  41. //接下来采用reduce步骤
  42. //8指定自定义的reduce类
  43. job.setReducerClass(MyReducer.class);
  44. //9指定输出的<k3,v3>类型
  45. job.setOutputKeyClass(Text.class);
  46. job.setOutputValueClass(Text.class);
  47. //10指定输出<K3,V3>的类
  48. //*下面这一步可以省
  49. job.setOutputFormatClass(TextOutputFormat.class);
  50. //11指定输出路径
  51. FileOutputFormat.setOutputPath(job, new Path(args[1]));
  52.  
  53. //12写的mapreduce程序要交给resource manager运行
  54. job.waitForCompletion(true);
  55. }
  56. private static class MyMapper extends Mapper<Object, Text, Text, Text>{
  57. private static Text line=new Text();
  58. @Override
  59. protected void map(Object k1, Text v1,
  60. Mapper<Object, Text, Text, Text>.Context context)
  61. throws IOException, InterruptedException {
  62. line=v1;//v1为每行数据,赋值给line
  63. context.write(line, new Text(""));
  64. }
  65. }
  66. private static class MyReducer extends Reducer<Text, Text, Text, Text>
  67. {
  68. @Override
  69. protected void reduce(Text k2, Iterable<Text> v2s,
  70. Reducer<Text, Text, Text, Text>.Context context)
  71. throws IOException, InterruptedException {
  72. context.write(k2, new Text(""));
  73. }
  74. }
  75. }

数据去重

运行结果:

[root@neusoft-master filecontent]# hadoop jar DataDeduplication.jar /neusoft/dedup_in /out12

[root@neusoft-master filecontent]# hadoop dfs -text /out12/part-r-00000

结果验证正确~

注意:HDFS的显示形式

[root@neusoft-master filecontent]# hadoop dfs -ls hdfs://neusoft-master:9000/out12

[root@neusoft-master filecontent]# hadoop dfs -ls  /out12 

等价表示形式

/out12的完整表达形式hdfs://neusoft-master:9000/out12

MapReduce实例(数据去重)的更多相关文章

  1. 利用MapReduce实现数据去重

    数据去重主要是为了利用并行化的思想对数据进行有意义的筛选. 统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. 示例文件内容: 此处应有示例文件 设计思路 数据 ...

  2. hadoop mapreduce实现数据去重

    实现原理分析: map函数数将输入的文本按照行读取,   并将Key--每一行的内容   输出    value--空. reduce  会自动统计所有的key,我们让reduce输出key-> ...

  3. MapReduce实现数据去重

    一.原理分析 Mapreduce的处理过程,由于Mapreduce会在Map~reduce中,将重复的Key合并在一起,所以Mapreduce很容易就去除重复的行.Map无须做任何处理,设置Map中写 ...

  4. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  5. hadoop —— MapReduce例子 (数据去重)

    参考:http://eric-gcm.iteye.com/blog/1807468 例子1: 概要:数据去重 描述:将file1.txt.file2.txt中的数据合并到一个文件中的同时去掉重复的内容 ...

  6. Mapreduce实例--去重

    数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选.统计大数据集上的数据种类个数.从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重. 数据去重的最终目标是让原始数据中 ...

  7. MapReduce实例

    1.WordCount(统计单词) 经典的运用MapReuce编程模型的实例 1.1 Description 给定一系列的单词/数据,输出每个单词/数据的数量 1.2 Sample a is b is ...

  8. Hadoop 数据去重

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

  9. map/reduce实现数据去重

    import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.co ...

随机推荐

  1. sql语句 case when then else end 语句实例

    表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. ----------------------------------------- ...

  2. ARC简介以及工程中ARC与非ARC的混合(转)

    ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并 ...

  3. Ansible 安装和管理服务

    ansible 使用 yum 模块来安装软件包,使用 service 模块来启动软件: [root@localhost ~]$ ansible 192.168.119.134 -m yum -a &q ...

  4. Charles抓包(iOS的http/https请求)

    Charles抓包(iOS的http/https请求) Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 官网下载安装Charles:https://www.charlesp ...

  5. 批量更改数据库表架构(生成sql后直接执行!)

    批量更改数据库表架构(生成sql后直接执行!) use my_test; --当前数据库 ), ), ), @NewSql VARCHAR(max), @Index INT; SET @SchemaO ...

  6. Foxmail邮箱最新应用指南 --如何使用「邮件标签」?

    Foxmail邮箱最新应用指南--如何使用「邮件标签」? 最近看到很多的朋友收发电子邮件,现在我们帮助讲解下foxmail的标签功能,可以帮助我们整理我们的邮箱,让重要信息浮出水面. 1.鼠标右键邮件 ...

  7. 【面试题】Java EE面试题

    第一部分:Servlet/JSP快速入门 1.      请列举至少6种javaEE技术,并简述其作用. 解析: javaEE是一系列的技术,主要包扩13种.对于开发人员来说,了解几种主要的技术是非常 ...

  8. 【docker】 VI/VIM 无法使用系统剪贴板(clipboard)

    docker 容器里边操作系统是ubuntu .默认是没有vim 的,需要自己安装一下 1 更新源 apt-get update 2 安装 vim apt-get install vim 此时.系统不 ...

  9. IE6/IE7/IE8下float:right的异常及其解决方法

    1.最简单的方法就是调换顺序,将需要右浮动的元素写在前面.写成这样:<h2><a href="#">更多>></a>小标题</ ...

  10. 【WEB前端系列之CSS】CSS3动画之Tranition

    前言 css中的transition允许css的属性值在一定的时间区间内平滑的过渡.这种效果可以在鼠标点击.获得焦点.被点击或对元素任何改变中触发,并圆滑的以动画效果改变CSS的属性值.语法: tra ...