什么是数仓?
一个面向主题的,集成的,稳定的,时变的,存储历史数据的仓库
时变性是存储的数据有时效性,过期的数据导出到其他地方保存
稳定是相对稳定,数据进入仓库后不会轻易改变,但是可以根据需求追加数据
集成的意思是不同来源的数据整合在一起
什么是数仓分层?
- 一般分3层,ods,dw,dm
- dw层又可以细分为dwd,dws,dwa等
ods:最原始的数据层
dwd:依据主题拆分存储,常见的星型模型和雪花模型就是在这一层。
dws层:数据服务层,依据需求分析提前进行整合,比如join一些表,有冗余
dim层:一个维度表
dm层:存放使用DW层数据进行业务统计的结果
分层的作用是什么?
复杂问题简单化、减少重复计算、血缘追踪、架构更清晰
表可以分哪些种类?
事务事实表:可以看做是保存某一事务的日志数据,事务一旦被提交就成为历史数据,只能以增量的方式维护。
维度表:从某个角度观察事实数据的窗口,存储的数据用来从某个角度描述事实。
全量表:保存每天所有的最新状态的数据
增量表:当数据改变时,将这个改变和改变后的结果记录下来,就是增量表。(a账户分两次存了100块,增量表显示为a账户金额100,200,并分别记录变化时间)
拉链表:用特定字段维护缓慢变化维度的表
流水表:记录表中所有改变的表。
周期快照表:按固定周期对事实表进行统计生成的表,按时间段保存记录,增量更新。
累积快照表:按过程对事实表进行统计生成的表,将每个事务切分成多个小事务,明确开始和结束的状态,每个小事务只保存一条结果。
拉链表如何实现
使用SCD策略维护特定字段实现。
SCD1:不保存历史数据,直接覆盖更新
SCD2:通过维护一个记录时间和一个过期时间来保存变化历史,增量更新
SCD3:通过维护一个历史字段来保存上次的数据,更新数据时,先检查旧数据是否存在,如果存在就把旧数据的最新值保存到新数据的旧值字段,采用覆盖更新的方式存储数据。
SCD4:单独建立一个历史维度表为该字段维护历史变化。
SCD5:混合使用123的维护策略。~~~~
如何建模?
业务建模
根据业务部门进行划分,理清部门之间的关系,然后将各个部门的具体业务程序化,与业务部门开会协商出需求的指标、保存年限、维度等等。总体来讲,就是要知道他们需要哪些指标以及他们能提供哪些数据。
业务建模的时间最长,而且与公司实际的业务环境息息相关,因此在这里需要根据实际生产环境和业务需求确认好数据仓库使用的工具和平台。
概念建模
将业务模型抽象化,分组合并类似的概念,细化概念,抽象出实体与实体之间的联系,理清各组概念之间的联系。说白了就是画图,把指标需要的哪些数据封装到一个实体里,实体与实体之间的关联等等用ER图表示出来。先画出局部ER图,最后再综合画出全局ER图。
逻辑建模
将概念模型实体化,具体考虑概念对应的属性,事件考虑事实属性,维度考虑维度属性。总体来说就是建表,前面已经画出了关系图,这里只要将表里头有哪些字段考虑出来就可以,如果是事实表就考虑事实字段和业务主键,如果是维度表就考虑维度属性,SCD策略等等。
在这里需要确定数据粒度,如果多个指标都用到一个字段,则取粒度最小的指标。如果不确定指标的量度,则取毫秒级作为粒度。
物理建模
综合现实的大数据平台、采集工具、etl工具、数仓组件、性能要求、管理要求等多方面因素,设计出具体的项目代码,完成数仓的搭建。
数仓的数据模型有哪些?
星型模型
数仓(具体说是dwd层)中只有一张包含历史数据且不冗余的事实表和一组附属维度表,每个维度一张。事实表与维度表之间通过外键和主键关联。
星型模型的维度表可能存在冗余,因此是反三范式的,这种模型在数据维护上较麻烦,但是性能更高,业界普遍使用星型模型。
星型模型的难点在于拉链表的维护,拉链表一般不能有冗余。
雪花模型
针对星型模型的维度表进行扩展的模型,将维度表拆解成维度表+说明表,说明表又可以进一步拆分,最终形成事实表-维度表-说明表的多次连接。
雪花模型的表一般遵循三范式,在数据的维护上会很方便,但是多表join影响性能。
星系模型
多个事实表采用星型模型共享维度表,就形成了一个星系。
Data Vault模型
从上述模型中我们不难看出,如果解决了拉链表的维护问题,星型模型的缺陷就已经可以忽略。
Data Vault模型由中心表、链接表、附属表、PIT表组成,这里的中心表,事实上就是维度表,链接表就是事实表、附属表是拉链表。
Data Vault模型就是通过将拉链表从维度表中分离出来,来达到方便维护的目的。
首先,中心表是一组业务生命周期内绝不会变的维度表,打个比方就是java里头的常量,常量再怎么冗余也不会有影响。
链接表则是保存流水类数据的事实表,它通过外键与多张中心表连接,但不会连接附属表。
附属表则是从维度表中抽出来的可能会发生变化的字段或表,这一部分就采用拉链表的方式创建,中心表则通过外键关联附属表的主键。
从同一维度表拆出来的字段根据变化维度不同可能还要分成多表存储,为了避免时效不一致,所以还会建立一张PIT表,用于维护附属表的变化历史。
中心表通过外键与PIT表相连,而PIT表则为每个附属表的主键都准备了一个时间字段保存数据的更新时间。
架构方式
inmon架构
自上而下的开发模式,从多个数据源出发,根据需求将不同数据源的数据经过ETL过程获取到各个主题需求的数据集成到数仓中,完成了数据治理后再进行统计业务,将统计结果存入数据集市。
kimball架构
自下而上的开发模式,往往已经存在某个关系明确的业务数据库,架构师需要根据数据库中的数据寻找出有价值的分析指标,然后根据这些指标建立数据集市,再从数据集市出发向下建设需要的数据仓库表。
数仓与数据库的区别?
操作上:数据库是面向事务的,往往是行级操作;数仓则是面向分析的,往往是范围操作
功能上:数据库提供即时的增删改查,数仓则寻求的是分析数据提供决策支持
设计上:数据库基于ER模型,面向业务;数仓基于星型/雪花模型,面向主题
数据上:数据库只保存最新的、近期的数据;数仓则保存所有数据
性能上:数据库往往依靠索引快速返回;数仓则往往需要大范围磁盘扫描
数据量:数据库数据一般为GB级别,数仓的数据则往往上百TB
响应速度:数据库是毫秒级,数仓任务的执行时间往往数小时
存储上:数据库是真实的物理存储,数仓则是逻辑存储。