第七章目录
第七章 数仓
数仓是一个面向主题的、集成的、稳定的、时变的,存储历史数据的仓库。
面向主题的:数仓中的数据按照主题进行存储,每个主题都是决策层分析的一个角度;
集成的:不同来源的数据会统一整合后存入数仓中;
稳定的:数据一旦进入仓库后不会轻易发生改变,就算数据本身需要变化也轻易不会改动原数据,会根据分析需求考虑数据的更新策略;
时变的:随着时间的推移,长时间不更新的数据会逐渐失去时效性,失去时效性的数据一般会被导出到外部压缩存储。目前常用的策略是"7年13个月",即保存维度信息的拉链表不保存七年前的数据,保存流水信息的事实表不保存13个月前的数据。
当然,上述保存策略也是根据情况决定,利用价值较低的原始数据可能只保存一个周期就被导出,高度聚合的数据可能保存更长的时间。
7.1 数仓分层
数仓往往分为三层,ods、dw、dm,而dw层又可以根据业务细分为dwd、dws、dwa等多层
7.1.1 ods层
操作型数据层,存放的是从不同来源进入数仓的原始数据,ods层往往只存放少量加工的原始数据,因此这里的数据不是集成的。
7.1.2 dw层
数据仓库的核心,它根据数仓架构可能再次细分多层:
7.1.2.1 dwd层
数据细节层。将ods层的数据统一整合后,依照各
主题需要将数据拆分存储,常见的星型模型和雪花模型就是在这一层。
7.1.2.2 dws层
数据服务层。按照范式存储的数据在分析时往往需要进行多表join,这样的分析效率很低,因此需要将dwd层的数据按照分析需求提前进行整合。由于主题之间的重合,该层的设计是反三范式的,存在数据冗余。
除了上述分层以外,dw还有基础数据层、轻度汇总层等等,根据数仓架构而定。
7.1.2.3 DIM层
维度层。有些数仓会将dwd层中的维度表单独抽离出来维护。
7.1.3 dm层
存放使用DW层数据进行业务统计的结果,它们可能被用于线上可视化的指标分析,也可能用于进一步的数据挖掘使用。
分层作用:复杂问题简单化、减少重复计算、血缘追踪、架构更清晰
7.2 表的种类和特征
事务事实表:可以看做是保存某一事务的日志数据,事务一旦被提交就成为历史数据,只能以增量的方式维护。
维度表:从某个角度观察事实数据的窗口,存储的数据用来从某个角度描述事实。
全量表:保存每天所有的最新状态的数据
增量表:当数据改变时,将这个改变和改变后的结果记录下来,就是增量表。(a账户分两次存了100块,增量表显示为a账户金额100,200,并分别记录变化时间)
拉链表:用特定字段维护缓慢变化维度的表
流水表:记录表中所有改变的表。
周期快照表:按固定周期对事实表进行统计生成的表,按时间段保存记录,增量更新。
累积快照表:按过程对事实表进行统计生成的表,将每个事务切分成多个小事务,明确开始和结束的状态,每个小事务只保存一条结果。
7.3 拉链表如何实现
使用SCD策略维护特定字段实现。SCD1:不保存历史数据,直接覆盖更新SCD2:通过维护一个记录时间和一个过期时间来保存变化历史,增量更新SCD3:通过维护一个历史字段来保存上次的数据,更新数据时,先检查旧数据是否存在,如果存在就把旧数据的最新值保存到新数据的旧值字段,采用覆盖更新的方式存储数据。SCD4:单独建立一个历史维度表为该字段维护历史变化。SCD5:混合使用123的维护策略。
7.4 数仓搭建
7.4.1 建模流程
业务建模
根据业务部门进行划分,理清部门之间的关系,然后将各个部门的具体业务程序化,与业务部门开会协商出需求的指标、保存年限、维度等等。总体来讲,就是要知道他们需要哪些指标以及他们能提供哪些数据。业务建模的时间最长,而且与公司实际的业务环境息息相关,因此在这里需要根据实际生产环境和业务需求确认好数据仓库使用的工具和平台。
概念建模
将业务模型抽象化,分组合并类似的概念,细化概念,抽象出实体与实体之间的联系,理清各组概念之间的联系。说白了就是画图,把指标需要的哪些数据封装到一个实体里,实体与实体之间的关联等等用ER图表示出来。先画出局部ER图,最后再综合画出全局ER图。
逻辑建模
将概念模型实体化,具体考虑概念对应的属性,事件考虑事实属性,维度考虑维度属性。总体来说就是建表,前面已经画出了关系图,这里只要将表里头有哪些字段考虑出来就可以,如果是事实表就考虑事实字段和业务主键,如果是维度表就考虑维度属性,SCD策略等等。在这里需要确定数据粒度,如果多个指标都用到一个字段,则取粒度最小的指标。如果不确定指标的量度,则取毫秒级作为粒度。
物理建模
综合现实的大数据平台、采集工具、etl工具、数仓组件、性能要求、管理要求等多方面因素,设计出具体的项目代码,完成数仓的搭建。
7.4.2 数据模型
星型模型
数仓(具体说是dwd层)中只有一张包含历史数据且不冗余的事实表和一组附属维度表,每个维度一张。事实表与维度表之间通过外键和主键关联。星型模型的维度表可能存在冗余,因此是反三范式的,这种模型在数据维护上较麻烦,但是性能更高,业界普遍使用星型模型。星型模型的难点在于拉链表的维护,拉链表一般不能有冗余。
雪花模型
针对星型模型的维度表进行扩展的模型,将维度表拆解成维度表+说明表