最近出现了好几次同样的对话场景:问:你是做什么的?答:最近在搞数据仓库。问:哦,你是传统行业的吧,我是搞大数据的。答:......
发个牢骚,搞大数据的也得建设数据仓库吧。而且不管是传统行业还是现在的互联网公司,都需要对数据仓库有一定的重视,而不是谈一句自己是搞大数据的就很厉害了。数据仓库更多代表的是一种对数据的管理和使用的方式,它是一整套包括了etl、调度、建模在内的完整的理论体系。现在所谓的大数据更多的是一种数据量级的增大和工具的上的更新。两者并无冲突,相反,而是一种更好的结合。
话说,单纯用用Hadoop、Spark、Flume处理处理数据,其实只是学会几种新的工具,这是搞工具的,只是在数据仓库中etl中的一部分。
对于数据的从业者来讲,要始终重视紧跟技术的变革,但是切记数据为王,在追求技术的极致的时候,不要忘了我们是搞数据的。
我们对数据进行分层的一个主要原因就是希望在管理数据的时候,能对数据有一个更加清晰的掌控,详细来讲,主要有下面几个原因:
数据体系中的各个表的依赖就像是电线的流向一样,我们都希望它是很规整,便于管理的。但是,最终的结果大多是第一幅图,而非第二幅图。
我们从理论上来做一个抽象,可以把数据仓库分为下面三个层,即:数据运营层、数据仓库层和数据产品层。
1.ODS全称是OperationalDataStore,操作数据存储
“面向主题的”,数据运营层,也叫ODS层,是最接近数据源中数据的一层,数据源中的数据,经过抽取、洗净、传输,也就说传说中的ETL之后,装入本层。本层的数据,总体上大多是按照源头业务系统的分类方式而分类的。
但是,这一层面的数据却不等同于原始数据。在源数据装入这一层时,要进行诸如去噪(例如去掉明显偏离正常水平的银行刷卡信息)、去重(例如银行账户信息、公安局人口信息中均含有人的姓名,但是只保留一份即可)、提脏(例如有的人的银行卡被盗刷,在十分钟内同时有两笔分别在中国和日本的刷卡信息,这便是脏数据)、业务提取、单位统一、砍字段(例如用于支撑前端系统工作,但是在数据挖掘中不需要的字段)、业务判别等多项工作。
2.数据仓库层(DW),是数据仓库的主体
在这里,从ODS层中获得的数据按照主题建立各种数据模型。例如以研究人的旅游消费为主题的数据集中,便可以结合航空公司的登机出行信息,以及银联系统的刷卡记录,进行结合分析,产生数据集。在这里,我们需要了解四个概念:维(dimension)、事实(Fact)、指标(Index)和粒度(Granularity)。
3.数据产品层(APP),这一层是提供为数据产品使用的结果数据
在这里,主要是提供给数据产品和数据分析使用的数据,一般会存放在es、mysql等系统中供线上系统使用,也可能会存在Hive或者Druid中供数据分析和数据挖掘使用。比如我们经常说的报表数据,或者说那种大宽表,一般就放在这里。
这三层技术划分,相对来说比较粗粒度,后面我们会专门细分一下。在此之前,先聊一下每一层的数据一般都是怎么流向的。这里仅仅简单介绍几个常用的工具,侧重中开源界主流。
2.ODS、DW-->App层
这里面也主要分两种类型:
网上的例子很多,就不列了,只举个笔者早期参与设计的数据分层例子。分析一下当初的想法,以及这种设计的缺陷。上原图。
此处@Ruby大神。现实是我只是个打酱油的。盗图、盗思想。
当初的设计总共分了6层,其中去掉元数据后,还有5层。下面分析一下当初的一个设计思路。
**缓冲层(buffer)**
明细层(ODS,OperationalDataStore,DWD:datawarehousedetail)
轻度汇总层(MID或DWB,datawarehousebasis)
主题层(DM,datemarket或DWS,datawarehouseservice)
应用层(App)
前面提到的一种设计其实相对来讲已经很详细了,但是可能层次会有一点点多,而且在区分一张表到底该存放在什么位置的时候可能还有一点点疑惑。我们在这一章里再设计一套数据仓库的分层,同时在前面的基础上加上维表和一些临时表的考虑,来让我们的方案更优雅一些。
下图,做了一些小的改动,我们去掉了上一节的Buffer层,把数据集市层和轻度汇总层放在同一个层级上,同时独立出来了维表和临时表。
这里解释一下DWS、DWD、DIM和TMP的作用。
有读者问了一些问题,是我之前有一些没讲清楚,补到这里。
答:ods之间到dws就好没必要过dwd,我举个例子,你的浏览商品行为,我做一层轻度汇总,就直接放在dws了。但是你的资料表,要从好多表凑成一份,我们从四五分个人资料表中凑出来了一份完整的资料表放在了dwd中。然后在app层,我们要出一张画像表,包含用户资料和用户近一年的行为,我们就直接从dwd中拿资料,然后再在dws的基础上做一层统计,就成一个app表了。
问:嗯,最后一个疑问,在现实生产中,可不可能存在计算dws时,会用到dwd表的情况?
答:不这样依赖就混了,dws不会依赖dwd,dws直接轻度汇总,业务用的话都说app。
问:就是说,dwd针对的是对象,它的数据质量处理有点像对用户等等的实体信息的纠错和汇总;dws针对的是行为,可以在某些维度上上卷的行为~
答:你这样理解吧dws存事实表,dwd维度表。
数据分层是数据仓库非常重要的一个环节,它决定的不仅仅是一个层次的问题,还直接影响到后续的血缘分析、特征自动生成、元数据管理等一系列的建设。因此适于尽早考虑。