数据仓库分层
在做像pv、cv类型的分析,往往借助于一张大宽表和几张维度表,所有的统计分析都基于这张大宽表与维度表。在这种简单的应用场景,这种设计没有问题且简单明了,但是如果业务场景复杂,数据种类多,维度多,那么数据仓库的设计就尤为重要,结构清晰明了的数据仓库设计将方便对问题数据进行排查。数据分层的好处:
清晰数据结构
减少重复开发
数据血缘追踪
把复杂问题简单化
屏蔽原始数据的异常
屏蔽业务的影响,不必改一次业务就需要重新接入数据
数据仓库可分为四层:ODS层、DW层、DM层、APP层。
在ODS层要考虑一定的数据清洗,比如异常字段的处理、字段命名规范化、时间字段的统一等。业务库:经常使用Sqoop抽取,比如每天定时抽取一次。在实时方面,可以考虑用canal监听MySQL的binlog,实时接入。埋点日志:线上系统会打入各种日志,这些日志一般会以文件的形式保存,可以选择用Flume定时抽取,也可以用SparkStreaming或Storm实时接入。
DW层:从ODS层中获得的数据按照主题建立各种数据模型。DW层由下到上分为:DWD(data warehouse detail,细节数据层),是业务层与数据仓库的隔离层;DWB(data warehouse base,基础数据层),存储的是客观数据,一般用作中间层,可以认为是大量指标的数据层;DWS(data warehouse service,服务数据层),基于DWB上的基础数据,整合汇总成分析某一主题域的服务数据,一般是宽表。
App层也称ADS层(application database service,数据产品应用层)。根据业务需要,可以直接提供查询展现,可导入至HBASE或MySQL中使用。
DWD明细视图,拉链表
DWD的数据依赖于ODS层,在这一层会进行过滤,转换,数据清洗等工作以及构建拉链表。由于作为ODS数据层的来源MySQL和HDFS中的数据是时刻会变化的,因此我们需要构建拉链表。
拉链表是针对数据仓库设计中表存储数据的方式而定义的。所谓拉链就是记录历史,记录一个事物从开始,一直到当前状态的所有变化的信息。
DW维度表
维度建模,数据拆分成事实表和维度表。
维度表(dimension)表示对分析主题所属类型的描述,信息比较固定,且数据量小,可以看作是用户来分析数据的窗口。每个维度表都包含单一的主键。维度表的主键可以作为与之关联的任何事实表的外键。维度表通常比较宽,是扁平型非规范表,包含大量的低粒度的文本属性。维度表示要对数据进行分析时所用的一个量,例如分析产品销售情况,可以按类别或按区域来分析. 这样的按…分析就构成一个维度。例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。在维度表中,每个表都包含独立于其他维度表的事实特性,例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。
事实表(fact table)是数据聚合后依据某个维度生成的结果表
每个数据仓库都包含一个或者多个事实数据表。事实数据表的主要特点是包含数字数据(事实),并且这些数字信息可以汇总,以提供有关单位作为历史的数据,每个事实数据表包含一个由多个部分组成的索引,该索引包含作为外键的相关性纬度表的主键,而维度表包含事实记录的特性。事实数据表不应该包含描述性的信息,也不应该包含除数字度量字段及使事实与纬度表中对应项的相关索引字段之外的任何数据。事实表的记录数会不断增加,表规模迅速增长。从最低的粒度级别来看,事实表行对应一个度量事件。
包含在事实数据表中的“度量值”有两种:一种是可以累计的度量值,另一种是非累计的度量值。用户可以通过累计度量值获得汇总信息,例如,可以汇总具体时间段内一组商店的特定商品的销售情况。非累计的度量值也可以用于事实数据表,例如,在一座大厦的不同位置测量温度时,如果将大厦中所有不同位置的温度累加是没有意义的,但是求平均值是有意义的。
一般来说,一个事实数据表都要和一个或多个维度表相关联,用户在利用事实数据表创建多维数据集时,可以使用一个或多个维度表。
结论: 1、事实表就是你要关注的内容
2、维度表就是你观察该事务的角度,是从哪个角度去观察这个内容的
例如,某地区商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维度表就是地区表。
DM宽表
DM层根据业务需求把DW层数据进行聚合或生成宽表。 通常是指业务主题相关的指标、维度、属性关联在一起的一张数据库表,方便业务快速生成报表。由于把不同的内容都放在同一张表存储,宽表已经不符合三范式的模型设计规范,会带来数据的大量冗余,但是会提高数据的查询性能。宽表的设计广泛应用于数据挖掘模型训练前的数据准备,通过把相关字段放在同一张表中,可以大大提高数据挖掘模型训练过程中迭代计算时的效率问题。
APP应用层
作为最终的报表,通常都是存储在MySQL中。
ODS与DW的区别
【1】数据的当前性
ODS包括的是当前或接近当前的数据,ODS反映的是当前业务条件的状态,ODS的设计与用户或业务的需要是有关联的,而DW则是更多的反映业务条件的历史数据。
【2】数据的更新或加载
ODS中的数据是可以进行修改的,而DW中的数据一般是不进行更新的。ODS的更新是根据业务的需要进行操作的,而没有必要立即更新,因此它需要一种实时或近实时的更新机制。另外,DW中的数据是按照正常的或预先指定的时间进行数据的收集和加载的。
【3】数据的汇总性
ODS主要是包括一些细节数据,但是由于性能的需要,可能还包括一些汇总数据,如果包括汇总数据,可能很难保证数据的当前性和准确性。ODS中的汇总数据生命周期比较短,所以可称作为动态汇总数据,如果细节数据经过了修改,则汇总数据同样需要修改。而DW中的数据可称为静态的汇总数据。
【4】数据建模
ODS是站在记录层面访问的角度而设计的,DW或DM则是站在结果集层面访问的角度而设计的。ODS支持快速的数据更新,DW作为一个整体是面向查询的。
【5】查询的事务
ODS中的事务操作比较多,可能一天中会不断的执行相同的事务,而DW中事务的到达是可以预测的。
【6】用途
ODS用于每一天的操作型决策,是一种短期的;DW可以获取一种长期的合作广泛的决策。ODS是策略型的,DW是战略型的。
【7】用户
ODS主要用于策略型的用户,比如保险公司每天与客户交流的客服;而DW主要用于战略型的用户,比如公司的高层管理人员。
【8】数据量(主要区别之一)
ODS只是包括当前数据,而DW存储的是每一个主题的历史快照;
数据仓库的整理架构,各个系统的元数据通过ETL同步到操作性数据仓库ODS中,对ODS数据进行面向主题域建模形成DW(数据仓库),DM是针对某一个业务领域建立模型,具体用户(决策层)查看DM生成的报表。ODS层的数据不能作为报表,因为部门只关心自己业务的数据而不关心全盘的数据,而ODS层中存放的是业务系统的明细数据,因此报表应该用DM层数据而非ODS层数据。