数据仓库实践杂谈(八)——去重
[目录]
- 第一章:概述
- 第二章:整体数据分层
- 第三章:整体实现框架
- 第四章:元数据
- 第五章:ETL
- 第六章:数据校验
- 第七章:数据标准化
- 第八章:去重
- 第九章:增量/全量
- 第十章:拉链处理
- 第十一章:分布式处理增量
- 第十二章:列式存储
- 第十三章:逻辑数据模型(数仓模型)
- 第十四章:数据模型参考
- 第十五章:维模型
- 第十六章:渐变维
- 第十七章:数据回滚
- 第十八章:关于报表
- 第十九章:数据挖掘
数据仓库实践杂谈(八)——去重
数据重复是一个比较麻烦的事情。从正常逻辑上来看,如果应用系统和数据卸出的程序没问题,不应该存在这个问题。但实际情况来看,确又时有发生。一旦确定数据源的数据会有重复的可能,就需要专门进行去重处理。
在数据量很大的情况下,去重很耗时。所以如果可以,尽量先行优化数据源系统。
最直观的去重可能就是先把数据加载到数据库中,然后通过select distinct *,直接把重复的数据去掉。但一般来说这是个悲剧。这种操作如果无法在分布式体系下执行,将会非常慢。
从算法角度,去重的处理流程包括如下两个步骤:
- 先排序,需要对所有数据进行整体排序;一般整行数据会比较大,可以先计算没一行数据的MD5(此MD5值可以保留,以后也有用的),然后针对MD5值进行排序;
- 然后逐行检查是否跟下一行相同,如果不同,下移一行;如果相同,标记出来,再看下一行是否相同,直到不同为止。
先说排序。排序算法很简单,这里处理基本都是文本,按字典值排序即可。但不管哪个排序算法,都需要把数据全部装到内存里面遍历、比较;而我们需要处理的数据可能远大于内存容量。所以,需要参考一下“外排序”的概念。
所谓“外排序”,是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。处理的流程也分为两个部分:
- 分割排序:把文件分割成多个小文件,每个小文件应该可以被整体读进内存进行排序处理,然后把每个排序后的结果回写成单独的文件。
- 归并,一般进行二路归并。把两个文件按顺序读出来对比,小的拿出来放到缓冲区(假设按正序),然后小的文件读下一行,合并的结果输出到新的文件;两两归并之后,最后得到完全排序的文件。
对排序后的文件进行去重就非常方便了。回头看看,为啥要排序呢?如果不排序,拿到某行数据,要找跟它相同的,需要把所有数据都看一遍;如果是排序的文件,只需要看下一行就行,如果相同就再看下一行。毕竟一份数据中出现重复的是很少的,一条数据重复多次的可能性更小,绝大多数都是往下看一行即可。
在这里,用MD5来排序和比较有比较大的好处。毕竟一般业务数据都很长,几十个字段很正常,而MD5只有128位。当然,使用MD5需要注意一点,MD5存在碰撞概率,也就是不同的输入可能得到同一个MD5值。因此,如果MD5值不相同的,可以直接认定数据不相同;但MD5值相同的话,则需要进一步比较实际数据内容。由于重复的数据比例很小,需要进一步比较的数据很少。而且计算MD5,也是很方便的通过切割文件分布并行的进行计算。
上述过程可以方便的移植到分布式体系上:
- 拆分成多个小文件每个文件在不同的节点上独立排序;
- 两两文件在不同的节点上进行归并;
- 按某个字段特诊,或者MD5值的前几位进行分片,每片数据在独立的节点上进行查重。
在Hadoop体系下,利用MapReduce来实现就相当方便了。文本排序也是MapReduce的经典案例了。只需要定义好自己的分割器,比如每1万条数据一个分片。很容易就实现分布式的排序。
然后再来一次MapReduce,进行分片去重操作即可。
当然,利用MapReduce去重,还有一个取巧的做法。根据Reduce的过程特性,会自动根据key来计算输入的value集合,把数据作为key输出给Reduce,无论这个数据出现多少次,reduce最终结果中key只能输出一次。按次思路,做一个Map把整行数据作为key,value设为空。Reduce输出key即可。这是得益于MapReduce处理过程内部做了对key的排序。如果每行数据很大,不管哪种方式实现,都建议用MD5来进行排序和比较,能进一步提高效率。
未完待续。
上一篇:数据仓库实践杂谈(七)-数据标准化
下一篇:数据仓库实践杂谈(九)-增量/全量
数据仓库实践杂谈(八)——去重相关推荐
- 数据仓库实践杂谈(七)——数据标准化
[目录] 第一章:概述 第二章:整体数据分层 第三章:整体实现框架 第四章:元数据 第五章:ETL 第六章:数据校验 第七章:数据标准化 第八章:去重 第九章:增量/全量 第十章:拉链处理 第十一章: ...
- 数据仓库实践杂谈(十七)——数据回滚
[目录] 第一章:概述 第二章:整体数据分层 第三章:整体实现框架 第四章:元数据 第五章:ETL 第六章:数据校验 第七章:数据标准化 第八章:去重 第九章:增量/全量 第十章:拉链处理 第十一章: ...
- 数据仓库实践杂谈-(二)-数据分层
[目录] 第一章:概述 第二章:整体数据分层 第三章:整体实现框架 第四章:元数据 第五章:ETL 第六章:数据校验 第七章:数据标准化 第八章:去重 第九章:增量/全量 第十章:拉链处理 第十一章: ...
- 数据仓库实践杂谈(六)-数据校验
[目录] 第一章:概述 第二章:整体数据分层 第三章:整体实现框架 第四章:元数据 第五章:ETL 第六章:数据校验 第七章:数据标准化 第八章:去重 第九章:增量/全量 第十章:拉链处理 第十一章: ...
- Greenplum 实时数据仓库实践(8)——事实表技术
目录 8.1 事实表概述 8.2 周期快照 8.3 累积快照 8.4 无事实的事实表 8.5 迟到的事实 8.6 累积度量 小结 上一篇里介绍了几种基本的维度表技术,并用示例演示了每种技术的实现过程. ...
- 20189200余超 2018-2019-2 移动平台应用开发实践第八周作业
20189200余超 2018-2019-2 移动平台应用开发实践第八周作业 ListView 1.自定义BaseAdapter,然后绑定ListView的最简单例子 先看看我们要实现的效果图: 一个 ...
- 数据仓库—stg层_有赞数据仓库实践之路
原标题:有赞数据仓库实践之路 一.大数据环境下的有赞数仓 关于数据仓库,在维基百科中将它定义为 用于报表和数据分析的系统,是商务智能 Business Intelligence 的核心部分.在数据仓库 ...
- 有赞数据仓库实践之路
转载自:有赞数据仓库实践之路 一.大数据环境下的有赞数仓 关于数据仓库,在维基百科中将它定义为用于报表和数据分析的系统,是商务智能 Business Intelligence 的核心部分.在数据仓库诞 ...
- EntityFramework之领域驱动设计实践(八)
仓储的实现:基本篇 我们先从技术角度考虑仓储的问题.实体框架(EntityFramework)中,操作数据库是非常简单的:在ObjectContext中使用LINQ to Entities即可完成操作 ...
最新文章
- IBM会话设置和覆盖规则
- 传统数据中心升级方案
- k8s 安装redis-operator并以operator方式部署redis-standalone redis-cluster集群完整操作记录
- 结合源码深入理解Android Crash处理流程
- java修饰类的关键字_JAVA中的修饰关键字
- 研究生念了些什么东西?
- 实名羡慕,国内这些厂.NET薪资高的吓人!
- 只做macd二次金叉_MACD指标的各种金叉、二次金叉都是买入信号吗?本文会给你答案...
- 【A】超全!深度学习在计算机视觉领域的应用一览
- 2014年5月30日
- 不可重复读和幻读的区别_面试官:MySQL的可重复读级别能解决幻读吗
- 时间序列分析:使用Pandas探索能源数据集
- 直击进博会 | 强生、默沙东、史赛克、雅培、丹纳赫、罗氏、拜耳等医药巨头带来哪些新产品、新技术?...
- 出现电脑蓝屏代码0x000000ed怎么解决
- Win11如何调整鼠标dpi?Win11调整鼠标dpi的方法
- 基于Booth算法的64位浮点乘法器的实现
- (1.4.10)SXF笔试题汇总
- python对excel中需要的数据的单元格填充颜色
- 金蝶加密服务器出现系统错误,金蝶KIS访问加密服务器失败,可能加密服务器未启动,错误代码5...
- 数显之家快讯:【SHIO世硕心语】董明珠北大演讲:十大掌声雷动的精彩看点!