上篇数仓分层-1中,对数仓分层意义和结构进行了介绍。 接下来对数仓分层的注意点和规范等进行介绍。

数仓分层的目的

分层的目的是解决数据任务及工作量的组织、数据的流向、读写权限的控制、不同需求的满足等各类问题。

数仓分层的误区

要避免分层走进误区,就要清楚数仓的内部分层不是为了划分而划分。明确数仓分层的目的。
当有了大致的分层结构时,我们就应该弄清楚每层的意思,分层划分的依据,分割线是什么。
进而针对具体业务,做出合适的分层。

宽表的误区

宽表是什么?至今位置没有一个明确的定义。通常做法是将很多的维度、事实相关联后形成一个所谓的宽表。

使用宽表,可以不用考虑与维度表的关联,也不用了解事实表和维度表。但这会带来的影响就是没有清晰的表结构和随意增长的宽度。

针对宽表的做法

  • 根据主题域和业务域,将某个业务的所有节点梳理清楚;
  • 将关键节点的数据作为事实表依据,然后横向扩充其他事实表上卷数据(包含一些统计指标),同时纵向的添加该节点上一些主键对应的维度;
  • 宽表的设计不依赖具体的业务需求而是根据整体业务线相匹配;
  • 尽量用维度建模代替宽表;

    维度建模代替宽表?

    为什么说尽量用维度建模代替宽表,就算字段和数据会冗余,维度建模的方式也会比全量数据的宽表模式较好?

  • 维度建模是以某一个既定的事实为依据,既然是事实表,那么这块的业务如果不变动的情况下,事实表的粒度基本不会改变;

  • 事实表和维度表解耦,维度表的变更事实表基本不会影响,结果表也只需要回刷一下数据流程即可;
  • 新增维度完全可以按照星型模型或者雪花模型动态添加新维度;
  • 维度模型可以作为宽表的基础,一旦确定全部的数据流程,可以通过维度模型再生成对应宽表进行快速的业务支撑;

    分层规则与规范

    ODS(原始数据层)

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

  • 以统计日期和时间进行分区保存。
  • 数据基本不做清洗和转换,数据的表结构和数据粒度与原业务系统保持一致。

    DWD(明细数据层)

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

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

    DIM(公共维度层)

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

  • 可以将维度与关联性强的字段进行整合,一种是水平整合:不同的表包含不同的数据,会使得维度本身的记录数变多,是对原有维度的记录数上的补充。另一种是垂直整合:不同的来源表包含相同的数据集,维度本身记录数不会变,只是会对维度属性进行补充。
  • 拆分针对重要性、业务相关性、源、使用频率等可分为核心表、扩展表。一种是水平拆分:两个业务相关性低,整合在一起会对模型的稳定性和易用性产生影响。另一种是垂直拆分:维度属性从落库时间,使用频次,等等因素考虑上需要进行拆分放到子维度上。

    DWS(汇总数据层)

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

  • 尽量减少数据访问时的计算量,优化表的关联。
  • 可以有数据冗余。
  • 不要在同一个表中存储不同粒度的聚集数据。

    ADS(数据应用层)

  • 数据公用性。

  • 清晰明了的统计周期。

附参考资料: