第七篇:经典案例:数据去重

穆晨 穆晨     2022-09-01     261

关键词:

需求

       去除掉海量文件中的存在着的重复数据,并将结果输出到单个文件中。

       比如有文件1中有以下数据:

       hello

       my

       name

       文件2中有以下数据

       my

       name

       is

       文件3中有以下数据

       name

       is

       fangmeng

       那么结果文件的内容应当如下(顺序不保证一致):

       hello

       my

       name

       is

       fangmeng  

方案制定

       Map阶段

1. 获取到输入后,按照默认原则切分输入。

2. 将切分后的value设置为map中间输出的key,而map中间输出的value为空值。

Shuffle阶段让具有相同的key的map中间输出汇集到同一个reduce节点上

Reduce阶段

       将获取到的键值对的第一个键取出,作为reduce输出的键,值依然为空,或者你也可以输出键值对的个数。

       注意是第一个键。因为会传递过来很多键值对 - 他们都有同样的键,只用选取第一个键就够了。

       这和其他案例中需要依次遍历Shuffle阶段传递过来的中间键值对进行计算的模式是不同的。

代码示例

 1 package org.apache.hadoop.examples;
 2 
 3 import java.io.IOException;
 4 
 5 //导入各种Hadoop包
 6 import org.apache.hadoop.conf.Configuration;
 7 import org.apache.hadoop.fs.Path;
 8 import org.apache.hadoop.io.Text;
 9 import org.apache.hadoop.mapreduce.Job;
10 import org.apache.hadoop.mapreduce.Mapper;
11 import org.apache.hadoop.mapreduce.Reducer;
12 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
13 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
14 import org.apache.hadoop.util.GenericOptionsParser;
15 
16 // 主类
17 public class Dedup {
18         
19     // Mapper类
20     public static class Map extends Mapper<Object, Text, Text, Text>{
21         
22         // new一个值为空的Text对象
23         private static Text line = new Text();
24                 
25         // 实现map函数
26         public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
27             
28             // 将切分后的value作为中间输出的key
29             line = value;
30             context.write(line, new Text(""));
31         }
32     }
33         
34     // Reducer类
35     public static class Reduce extends Reducer<Text,Text,Text,Text> {
36     
37         // 实现reduce函数
38         public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
39                 
40             // 仅仅输出第一个Key
41             context.write(key, new Text(""));
42         }
43     }
44 
45     // 主函数
46     public static void main(String[] args) throws Exception {
47     
48         // 获取配置参数
49         Configuration conf = new Configuration();
50         String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
51                 
52         // 检查命令语法
53         if (otherArgs.length != 2) {
54             System.err.println("Usage: Dedup <in> <out>");
55             System.exit(2);
56         }
57 
58         // 定义作业对象
59         Job job = new Job(conf, "Dedup");
60         // 注册分布式类
61         job.setJarByClass(Dedup.class);
62         // 注册Mapper类
63         job.setMapperClass(Map.class);
64         // 注册合并类
65         job.setCombinerClass(Reduce.class);
66         // 注册Reducer类
67         job.setReducerClass(Reduce.class);
68         // 注册输出格式类
69         job.setOutputKeyClass(Text.class);
70         job.setOutputValueClass(Text.class);
71         // 设置输入输出路径
72         FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
73         FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
74                 
75         // 运行程序
76         System.exit(job.waitForCompletion(true) ? 0 : 1);
77     }
78 }

运行结果

       

小结

       去重在日志分析中有非常广泛的应用,本例也是MapReduce程序的一个经典范例。

秒杀多线程第七篇经典线程同步互斥量mutex(代码片段)

阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》 前面介绍了关键段CS、事件Event在经典线程同步... 查看详情

第七篇pythonio操作

文章目录10文件操作10.1打开与关闭10.1.1打开文件10.1.2关闭文件10.2文件的读写10.2.1写数据(write)10.2.2读数据(read)10.2.3读数据(readlines)10.2.4读数据(readline)10.3文件的常用操作10.3.1获取当前读写的位置10.3.2定位到某个位置10.3.3文件... 查看详情

第七篇pythonio操作

文章目录10文件操作10.1打开与关闭10.1.1打开文件10.1.2关闭文件10.2文件的读写10.2.1写数据(write)10.2.2读数据(read)10.2.3读数据(readlines)10.2.4读数据(readline)10.3文件的常用操作10.3.1获取当前读写的位置10.3.2定位到某个位置10.3.3文件... 查看详情

powerbi开发第七篇:数据集和数据刷新

PowerBI报表是基于数据分析的引擎,数据真正的来源(DataSource)是数据库,文件等数据存储媒介,PowerBI支持的数据源类型多种多样。PowerBIService(云端)有时不直接访问DataSource,而是直接从PowerBIService创建的数据集(Dataset)中获... 查看详情

数据结构第七篇——顺序栈

?注:未经博主同意,不得转载。  栈(stack)是常用的重要数据结构,其应用十分广泛。栈是一个操作受限的线性表,其插入和删除操作都在表的同一端进行。  其中允许操作的一端称为栈顶(top),另一端称为栈底(bottom... 查看详情

小刘同学的第七篇博文

真是醉了,最近笔记本坏了没办法,只好给自己的平板装数据库,而且平板没有网线接口,只有用校园网下,500KB,很酸爽。。。上午上了一下午,然后又解了个压,解压解了半小时,平板的配置是真的低。。。又安装了一下午... 查看详情

第七篇:面向对象高级

第七篇:面向对象高级   PYTHON-绑定方法反射内置函数PYTHON-组合封装多态property装饰器 查看详情

第七篇:数据预处理-数据归约(pca/efa为例)

前言    这部分也许是数据预处理最为关键的一个阶段。    如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析。    本文仅介绍主成分分析法(PC... 查看详情

r语言学习第七篇:列表(代码片段)

列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型。列表项可以是列表类型,因此,列表被认... 查看详情

数据分析第七篇:相关分析(代码片段)

相关分析是数据分析的一个基本方法,可以用于发现不同变量之间的关联性,关联是指数据之间变化的相似性,这可以通过相关系数来描述。发现相关性可以帮助你预测未来,而发现因果关系意味着你可以改变世界。 一,协... 查看详情

flask第七篇flask中的wtforms使用

一、简单介绍flask中的wtformsWTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证。安装:pip3installwtforms二、简单使用wtforms组件1、用户登录具体代码:fromflaskimportFlask,render_template,request,redirectfromwtforms.fieldsimp... 查看详情

mongodb基础教程系列--第七篇mongodb聚合管道

在讲解聚合管道(Aggregation Pipeline)之前,我们先介绍一下MongoDB的聚合功能,聚合操作主要用于对数据的批量处理,往往将记录按条件分组以后,然后再进行一系列操作,例如,求最大值、最小值、平均值,求和等操作。聚... 查看详情

mysql从青铜到王者第七篇:mysql内外连接

系列文章目录文章目录系列文章目录前言一、表的内连和外连(重点)1.内连接1.案例:显示SMITH的名字和部门名称2.外连接1.左外连接1.查询所有学生的成绩,如果这个学生没有成绩,也要将学生的个人信息显... 查看详情

vue.js学习笔记第七篇表单控件绑定

本篇主要说明表单控件的数据绑定,这次没有新的知识点文本框1、普通文本框<divid="app-1"><p><inputv-model="textBox"placeholder="输入内容...">输入的内容:{{textBox}}</p></div><scripttype="text/javascript">varvm1=ne 查看详情

第七篇图像分类的评价指标

文章目录摘要混淆矩阵准确率(Accuracy)精确率(Precision)召回率(Recall)F1-score代码样例 查看详情

第七篇图像分类的评价指标

文章目录摘要1、混淆矩阵2、准确率(Accuracy)3、精确率(Precision)4、召回率(Recall)5、F1-score6、代码样例 查看详情

第七篇-列表式app:listactivity及listview

一、新建一个emptyactivity的项目。二、修改MainActivity.java:extendsAppCompactActivity改为extendsListActivity。注释掉setContentView(R.layout.activity_main);packagecom.example.aimee.listapp;importandroid.app.ListActivity;im 查看详情

html+css第七篇-表格

表格标签:table表格thead表格头tbody表格主体tfoot表格尾tr表格行th元素定义表头td元素定义表格单元表格样式重置table{border-collapse:collapse;}单元格间隙合并th,td{padding:0;}重置单元格默认填充colspan属性规定单元格可横跨的列数。<tdco... 查看详情