查看原文
其他

数据仓库分层你清楚了吗

The following article is from 大数据左右手 Author 点击关注👉👉

为什么要分层

在实际的工作中,我们都希望自己的数据能够有顺序地流转,设计者和使用者能够清晰地知道数据的整个声明周期。优秀可靠的数仓体系,需要良好的数据分层结构。合理的分层,能够使数据体系更加清晰,使复杂问题得以简化。合理的分层概括就是:清晰的数据结构与依赖,提高开发效率,合理的数据权限。具体具有以下优点:

数据结构与依赖关系:如果没有清晰的分层,可能会做出一套表依赖结构混乱,且出现循环依赖的数据体系,让流程越走越越死。

减少重复开发的成本:建立一个或者多个模型,可以为支业务撑建立多个指标。规范数据分层,开发通用的中间层,可以极大地减少重复计算的工作。

统一数据口径:通过数据分层,提供统一的数据出口,统一输出口径。

数据一致性:对于公共下沉数据,下游使用的时候不再重新计算,可以保证一定是数据一致性问题。

数据权限:通过分层,可以更方便地对不同层,不同的数据模型进行权限管理,特定业务场景下,对不同的开发人员和业务人员屏蔽一些敏感的数据。

怎么分层

ODS(原始数据层)

存放最原始的数据,结构和源系统保持一致,减少对业务系统的影响。

DWD(明细数据层)

在维度建模的理论上进行构建,存放维度模型中的事实表,保存各业务过程最小粒度的操作记录。有时候,为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。

DIM(公共维度层)

在维度建模的理论上进行构建,存放维度模型中的维度表,保存一致性维度信息。维度类分两种类型(自己概括的):

大维度数据:比如用户维度等等

小维度数据:比如配置表,日期表,地区表等等

DWS(汇总数据层)

基于上层的指标需求,以分析的主题对象作为建模驱动,构建公共统计粒度的汇总表。该层的数据表会相对比较少,一张表会涵盖比较多的业务内容,由于其字段较多,因此一般也会称该层的表为宽表。主要作用就是提升指标的复用性,减少重复加工。单维度下的轻度汇总表维度单一,统计指标丰富,迭代更灵活;多维度的轻度汇总表,维度丰富,统计指标有限,迭代相对复杂。

ADS(数据应用层)

存放各项统计指标结果。

分层的误区

数仓层内部的划分不是为了分层而分层,分层是为了解决数据 任务及工作流的组织、数据的流向、读写权限的控制、不同需求的满足等各类问题。对于上面分层罗列,是种通用的建设分层逻辑。可能你也看到有四层的,有六层的,甚至更多的,比如DWD,DWB,DIM,DWM,MID......虽然每层你知道什么意思,但是有时候不是很清楚这些层之间的分割线是什么,出现复杂的业务反而让我们无法下手。所以各个业务不同,需要合适自己的就好。

所谓的宽表

经历几家公司,也听过好多公司,通常做法是把很多的维度、事实相关联后形成一个所谓的宽表。可能刚开始维度数据比较少,但是跟着业务的增长冗余维度增加,宽表足够的事实,足够的维度宽。带来影响就是没有清晰的表结构和随意增长的宽度。

所以,一些人开始强调划分主题,按照某一主题事实去扩展维度。也即宽表的涉及不依赖具体的业务需求而是根据整体业务线相匹配。

分层规则与规范

ODS

(1) 根据源业务系统表的情况以增量或全量方式抽取数据。

(2) 以统计日期和时间进行分区保存。

(3) 数据基本不做清洗和转换,数据的表结构和数据粒度与原业务系统保持一致。

DWD

(1)对数据做清洗、转换,脱敏等等处理,可以对表结构进行裁剪和汇总等操作。

(2)不是所有的数据都要永久保存,根据业务周期去做出决定。

DWD层中主要的事实表有三种类型 : 事务事实表、周期快照事实表和累积快照事实表。

事务型事实表

是什么

事务事实表用来记录各业务过程,跟踪时间上某点的度量事件,它保存的是各业务过程的原子操作事件,即最细粒度。

场景

事务型事实表可用于分析与各业务过程相关的各项统计指标,由于其保存了最细粒度的记录,可以提供最大限度的灵活性,可以支持无法预期的各种细节层次的统计需求。

不适合干什么

(1)存量型指标不适合

比如说商品库存,账户余额... 对于这种存在进进出出(加或减操作)不适合。一张存储商品的进货的原子操作事件,一张存储商品出库的原子操作事件。如果要统计当日的库存有多少,这就需要对进货表和出库表进行操作,需要一正一反地区分对库存的影响。所以在写代码或者sql过程还是执行效率都会打折扣。

(2)多事务关联统计不适合

比如在订单中,建立了下单事务事实表和支付事务事实表,现在指标统计某个时间内用户下单到支付的时间间隔的平均值,这就需要这两个表的Join操作,然而,订单在大型公司属于大表,大表 Join 大表 你可想而知。

周期型快照事实表

周期快照事实表以具有规律性的、可预见的时间间隔来记录事实,一般周期可以是每天、每周、每月、每年等。主要用于分析一些存量型或者状态型指标

场景

存量型:例如对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求。

状态型:例如对于空气温度、行驶速度这些状态型指标,由于它们的值往往是连续的,我们无法捕获其变动的原子事务操作,所以无法使用事务型事实表统计此类需求。而只能定期对其进行采样,构建周期型快照事实表。

累积型快照事实表

用来描述过程开始和结束之间的关键步骤事件,覆盖过程的整个生命周期,通常具有多个时间字段来记录关键时间点,当过程随着生命周期不断变化时,记录也会随着过程的变化而被修改。

场景

如交易流程中的下单、支付、发货、确认收货业务过程。会具体记录下单时间,支付时间,发货时间,收获时间。如果统计某个时间内用户下单到支付的时间间隔的平均值。这样就轻松搞定。

对比

-事务型事实表周期型事实表累积型快照事实表
时间离散事务时间每天、每周、每月、每年等多个时间字段来记录关键时间点
粒度每行代表实体的一个事务每行代表某时间周期的一个实体每行代表一个实体的生命周期
数据加载方式insertinsertinsert/update

DIM

(1) 维度在不同的业务表中的字段名称、数据类型、数据内容必须保 持一致。

(2)可以将维度与关联性强的字段进行整合,一种是水平整合:不同的表包含不同的数据,会使得维度本身的记录数变多,是对原有维度的记录数上的补充。另一种是垂直整合:不同的来源表包含相同的数据集,维度本身记录数不会变,只是会对维度属性进行补充。

(3)拆分针对重要性,业务相关性、源、使用频率等可分为核心表、扩展 表。一种是水平拆分:两个业务相关性低,整合在一起会对模型的稳定性和易用性产生影响。另一种是垂直拆分:维度属性从落库时间,使用频次,等等因素考虑上需要进行拆分放到子维度上。

DWS

(1)存放比较全的历史数据,业务发生变化时易于扩展,适应复杂的实际业务情况。

(2)尽量减少数据访问时的计算量,优化表的关联。

(3)可以有数据冗余。

(4)不要在同一个表中存储不同粒度的聚集数据。

ADS

(1)数据公用性。

(2)清晰明了的统计周期。

(3)等你补充......

- EOF -

推荐阅读  点击标题可跳转

1、漫谈数据仓库的分层架构与演进

2、网易数帆数据生产力方法论

3、从感知机到 Transformer,一文概述深度学习简史

关注「大数据与机器学习文摘」

看精选技术文章和最新行业资讯

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存