No.67 Hadoop 实践案例——记录去重

转载声明

本文为灯塔大数据原创内容,欢迎个人转载至朋友圈,其他机构转载请在文章开头标注:转自:灯塔大数据;微信:DTbigdata

编者按:灯塔大数据将每周持续推出《从零开始学大数据算法》的连载,本书为哈尔滨工业大学著名教授王宏志老师的扛鼎力作,以对话的形式深入浅出的从何为大数据说到大数据算法再到大数据技术的应用,带我们在大数据技术的海洋里徜徉~每周五定期更新

上期回顾&查看方式

在上一期,我们学习了“Hello World”程序的相关内容。PS:了解了上期详细内容,请在自定义菜单栏中点击“灯塔数据”—“技术连载”进行查看;或者滑到文末【往期推荐】查看。

No.67

Hadoop 实践案例——记录去重

Mr. 王:现在我们看一个和 WordCount 很相似,在实际中应用也很多的例子——记录去重。

小可 :嗯,从字面上理解就是将重复的数据记录去除吧?

Mr. 王 :是的,就是如此。这个工作在实际的应用中是非常常见的,在进行数据管理时,不论是录入记录错误,还是新旧数据的原因,都是非常容易出现重复的记录的。很多时候,重复的记录会对我们进行个数统计等操作产生影响,造成统计结果错误。另外,出现重复记录的数据集合可能会非常大,单靠人工挑重,或者是靠简单的单机去查找会比较慢,所以我们要尝试借助并行机制来解决这个问题。

下面给出一些输入输出的例子。

比如现在有一些通讯录文件

我们希望合并这些通讯录文件,去掉其中重复的数据,将它变成如下这样不含重复记录的数据 :

你来想一想这个问题可以怎么解决?

小可 :嗯……也不能用每一个数据到整个数据集合里面查找啊,这样效率岂不是太低了。在很多数据库中,都有很多手段来防止重复数据的出现,比如主键机制。它作为唯一识别数据的标识,是不允许出现重复的。

Mr. 王启发道 :想一想之前我们学过哪个例子?

小可顿时恍然大悟 :对了,这个工作其实跟WordCount 很像啊!我们只要对所有的记录进行计数,然后再去掉这个计数就可以了!

Mr. 王 :很好,其实仔细想想,记录去重这个工作和 WordCount 是非常相似的。不过记录去重我们可以做的更加简单。第一,我们关注的是记录,而不是单词,所以无须对记录进行单词切分,只需要把整条记录当作一个数据项就可以了。其实这样做也是有必要的,因为很多时候,在电话簿里面具有相同名字的记录并不一定有着相同的电话号码。这就意味着,只有两条完全相同的记录才是重复记录,所以我们使用整条记录作为关键词去重,反而省去了切分单词的操作。第二,在记录去重的工作中,我们并不关心重复记录出现了几次,直接合并它们就可以了,所以完全可以不去设置记录出现数量的计数器。至于在 WordCount 中那个 (word,1) 中的1,我们随意填写一个数据就可以,一般用空字符串就行,这样比较节省存储空间。

小可 :嗯,似乎比 WordCount 更简单了一些。

Mr. 王 :好了,我们来看看实现它的源代码。

Mr. 王 :前面和后面的部分这里就不多说了,可以看作是实现类似的 Hadoop 操作的固定格式。当然,其实其中的内容也是非常容易识别的,Java 以完整的单词进行类和对象命名的特点使得类和操作的识别变得非常容易,可以很容易地读懂。我们重点来看看对 Map 和 Reduce两个基本操作的设计。

首先来看 Map 的设计。

在新版本 Hadoop 的标准 API 中,Map 是 Mapper 基类的派生类。我们先定义一个派生于Mapper 的 Map 类。

然后定义一个 map 函数,设计接收的 key-value 对的形式。

从接收到的来自文本的数据记录中将其提取出来作为一个新的变量。

在新版本的 API 中,我们使用 context 来表示要发出(emit)的数据记录。在这里我们将接收到的数据作为 key,而 value 就像前面说过的那样,填写一个空值就可以了。

接下来是 reduce 类,它同样派生于 Reducer 基类。

在 reduce 这个函数中,我们定义 Reduce 的基本操作,在这里要接收 map 发出的键值对。虽然 value 并没有意义的,但我们依然要像有 value 那样生成一个 values 列表来接收大量的空串。

不过在这个 Reduce 中,我们并不执行任何操作,只是将接收到的 key 写到结果中。

下期精彩预告

本文来自企鹅号 - 灯塔大数据媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

Java高级软件工程师面试考纲

如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构、算法、网络、操作系统等知识。因此本文不会讲解具体的技术,笔者综合自...

651
来自专栏一个会写诗的程序员的博客

UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)

继承 指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;...

1051
来自专栏阮一峰的网络日志

Javascript的10个设计缺陷

前几篇文章,我经常说Javascript的设计不够严谨,有很多失误。 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设计缺陷...

3627
来自专栏从流域到海域

Python 条件判断

Python if语句 格式:注意不要漏写:这是容易犯错的地方。 if语句包含两部分,判断部分和执行部分,只有在判断部分得到的布尔值为True时,才会执行执...

24310
来自专栏IT可乐

深入理解计算机系统(5.1)------优化程序性能

  你能获得的对程序最大的加速比就是当你第一次让它工作起来的时候。   在讲解如何优化程序性能之前,我们首先要明确写程序最主要的目标就是使它在所有可能的情况下都...

23710
来自专栏Python爬虫与算法进阶

爬虫之全站爬取方法

其实这个很好理解。比如说知乎,一个大V有100W粉丝,从这个大V出发,抓取粉丝的粉丝,一直循环下去。(可能是个死循环)

3753
来自专栏Crossin的编程教室

【每周一坑】校验文件哈希

先说个通知,给参与了码上行动的同学:又一期展示学习成果的编程擂台活动开始了,即是练手的好机会,又能得到助教的全程支持,还可以得积分赢奖金。赶紧来报名吧!从课程首...

35911
来自专栏灯塔大数据

每周学点大数据 | No.36并行算法

No.36期 ‍并行算法‍ Mr. 王:‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍今天我们来谈一个新的话题——并行算法。 小可:并行?并行是不是说,一个任务由多个人...

28710
来自专栏函数式编程语言及工具

细谈Slick(5)- 学习体会和将来实际应用的一些想法

   通过一段时间的学习和了解以及前面几篇关于Slick的讨论后对Slick这个函数式数据库编程工具有了些具体的了解。回顾我学习Slick的目的,产生了许多想法...

2058
来自专栏Java编程技术

UML建模(类图)

类图是面向对象系统建模中重要的图,是定义其它图的基础。类图主要是用来展现软件系统中的类、接口以及它们之间的静态结构。

1192

扫码关注云+社区

领取腾讯云代金券