每周学点大数据 | No.67 Hadoop 实践案例——记录去重

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 写到结果中。

下期精彩预告

经过学习,我们研究了记录去重涉及到的一些具体问题。在下一期中,我们将进一步了解Hadoop 实践案例——等值连接的相关内容。更多精彩内容,敬请关注灯塔大数据,每周五不见不散呦!

文章作者:王宏志

文章编辑:田芳

原文发布于微信公众号 - 灯塔大数据(DTbigdata)

原文发表时间:2017-12-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Jerry的SAP技术分享

如何用JavaScript实现2+2=5?

我大学毕业找工作时,经常做一些稀奇古怪的面试题。这不,给大家分享一道整蛊的面试题,它其实不能算一道正式的面试题,大家可以用它来捉弄你们那些程序员朋友。

1021
来自专栏安恒网络空间安全讲武堂

赛前福利②最新2018HITB国际赛writeup

FIRST 距离“西湖论剑杯”全国大学生网络空间安全技能大赛只有9天啦! 要拿大奖、赢offer,那必须得来点赛前练习定定心啊~这不,讲武堂就拿到了2018HI...

3404
来自专栏个人分享

Spark之SQL解析(源码阅读十)

  如何能更好的运用与监控sparkSQL?或许我们改更深层次的了解它深层次的原理是什么。之前总结的已经写了传统数据库与Spark的sql解析之间的差别。那么我...

1442
来自专栏Pythonista

Python之路,Day1 - Python基础1

python的创始人为吉多·范罗苏姆(Guido van Rossum)。1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解...

1995
来自专栏数据小魔方

R语言数据处理——数据合并与追加

数据结构的塑造是数据可视化前重要的一环,虽说本公众号重心在于数据可视化,可是涉及到一些至关重要的数据整合技巧,还是有必要跟大家分享一下的。 在可视化前的数据处理...

3729
来自专栏玄魂工作室

Hacker基础之Python篇:一、环境安装和基础知识

0x01. 前言 emmmmmmm...你只需知道这是一门用途很广的语言,上到大数据AI,下到Linux运维,都可以使用Python,当然,黑客也用Pyth...

3026
来自专栏王亚昌的专栏

合理使用const,慎用自运算

    项目最的出了几次运营事故,都是因为使用自乘、自加、自減运算,错改了非局部变量,导致将用户数据写溢出,最终只能进行回档处理。先给大家展示一下,漏出bug的...

1031
来自专栏C语言及其他语言

训练场题库中判题结果的详细解释

对于判题结果仅仅是大致的解释,仍不少同学感到迷惑,那今天我们就对这些结果一一详细解释并举例说明,让大家彻底觉悟! 等待 等待服务器正忙,请稍后查看运行并评判您的...

3395
来自专栏前端小吉米

学好 MP4,让直播更给力

2944
来自专栏企鹅号快讯

LeetCode测试数据的爬虫

LeetCode的(包括付费)题目到处都有,可是测试数据怎么找呢?我设想了一种方法,来获得每道题的测试数据。 首先,对于权限不严格的在线评测系统,比如以前常做的...

6108

扫码关注云+社区

领取腾讯云代金券