暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据仓库分层设计

大数据启示录 2022-05-18
359

数仓分层的意义


隔离原始数据

不论是数据的异常还是数据的敏感性,是真实数据于统计数据解藕开

清晰数据结构体系

每一个数据分层都有它的作用域,这样在使用表的时候能更方便的定位和理解。

数据血缘追踪

由于最终给业务呈现的是一个能直接使用的业务表,但是表的数据来源有很多,如果有一张来源表出问题了,我们希望能够快速准确的定位到问题,并清楚它的影响范围,从而及时给到业务方反馈,从而将损失降到最低

减少重复开发和资源浪费

  • 规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算;

  • 清晰明了的结构使得开发、维护的成本降低;

  • 减少重复计算和存储的资源浪费;

复杂问题简单化

将一个复杂的任务分解成多个步骤来完成,每一层只处理单一的步骤,比较简单和容易理解。而且便于维护数据的准确性,当数据出现问题之后,可以不用修复所有的数据,只需要从有问题的步骤开始修复。

 


数仓各层级说明

 

层级

说明

描述

数据共享权限

ODS

原始数据层

存放未经过处理的原始数据至数据仓库系统,结构上与源系统保持一致,是数据仓库的数据准备区,数据原则上全量保

private

DWD

明细数据层

以业务过程作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表。数据粒度一般保持和ODS层一样的,并且提供一定的数据质量保证。同时为了提高数据明细层的易用性,该层会采用一些维度退化手法,将维度退化至事实表中,减少事实表和维表的关联。同时在此层会采用明细宽表,复用关联计算,减少数据扫描(逻辑事实表)

public

DWM

中间明细层

etl处理过程中的桥接表,临时表,另外一些业务域的聚合统计需求时,也建议放到这一层


DWS

公共汇总层

以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标事实表,以宽表化手段物理化模型。构建命名规范、口径一致的统计指标,为上层提供公共指标,建立汇总宽表、明细事实表。

(汇总数据层 + 主题宽表)

公共汇总粒度事实层的表通常也被称为汇总逻辑表,用于存放派生指标数据。

{entity}_action_tablename

nft_config

public

DIM

公共维度层

基于维度建模理念思想,建立整个企业的一致性维度。降低数据计算口径和算法不统一风险。以维度作为建模驱动,基于每个维度的业务含义,通过添加维度属性、关联维度等定义计算逻辑,完成属性定义的过程并建立一致的数据分析维表。为了避免在维度模型中冗余关联维度的属性,基于雪花模型构建维度表。维度层的表通常也被称为维度逻辑表。

  • 高基数维度数据

一般是用户资料表、商品资料表等类似的资料表。数据量可能是千万级或者上亿级别。

  • 低基数维度数据

一般是配置表,比如枚举值对应的中文含义,比如国家、城市、县市、街道等维表。数据量可能是个位数或者几千几万。

public

DM

数据应用层

也叫DM(数据集市)或APP层等,面向实际的数据需求,可以直接给业务人员使用,以DWD或者DWS层的数据为基础,组成各种统计报表。除此之外还有一些直接的表现形式,例如主题大宽度表集市,以及横表转纵表等。

public


数仓各层级的注意事项和分层原则


ods层:

(1)保持数据原貌不做任何修改,起到备份数据的作用。

(2)数据采用压缩,减少磁盘存储空间(例如:原始数据100G,可以压缩到10G左右)

(3)创建分区表,防止后续的全表扫描

(4)增量数据,全量数据两种同步方式

 

dwd层:

 

明细事实表设计原则:

  • 通常,一个明细粒度事实表仅和一个维度关联。

  • 尽可能包含所有与业务过程相关的事实 。

  • 只选择与业务过程相关的事实。

  • 分解不可加性事实为可加的组件。

  • 在选择维度和事实之前必须先声明粒度。

  • 在同一个事实表中不能有多种不同粒度的事实。

  • 事实的单位要保持一致。

  • 谨慎处理Null值,建议用0填充。

  • 使用退化维度提高事实表的易用性。


dws层: 

  
  

公共汇总事实表设计原则:

  • 数据公用性 

比如,汇总的聚集表能否与他人公用?基于某个维度的聚集是否是数据分析或者报表中经常使用的?如果满足这些情况,我们就有必要把明细数据沉淀到汇总表中。

  • 不跨数据域

数据域是在较高层次上对数据进行分类聚集的抽象,如交易统一划到交易域下,商品的新增、修改放到商品域下。

  • 区分统计周期

表命名上要能说明数据的统计周期,如_1d 表示最近1天,_td 截止到当天,_nd 表示最近N天。

  • 避免多个层级的数据

应该避免将不同层级的数据放在一起,比如,如果存在7天和30天的事实,我们可以选择用两列存放7天和30天的事实,但是需要在列名和字段注释上说明清楚。同时我们也可以使用两张表分别存储不同统计周期的数据加以区分。

  • 聚集是不跨越事实的

聚集是针对原始星型模型进行的汇总,为了获取和查询原始模型一致的结果,聚集的维度和度量必须与原始模型保持一致,因此聚集是不跨事实的。横向钻取(交叉探查)是针对多个事实基于一致性维度进行的分析,很多时候采用融合事实表,预先存放横向钻取的结果,从而提高查询性能。因此融合事实表是一种导出模式而不是聚集。




 dim层: 

在设计公共维度表时需要考虑:

  • 维表中数据的稳定性。

例如,A公司电商会员通常不会出现消亡,但会员数据可能在任何时候更新,此时要考虑创建单个分区存储全量数据。如果存在不会更新的记录,您可能需要分别创建历史表与日常表。日常表用于存放当前有效的记录,保持表的数据量不会膨胀;历史表根据消亡时间插入对应分区,使用单个分区存放分区对应时间的消亡记录。

  • 维表是否需要垂直拆分。

如果一个维表存在大量属性不被使用,或由于承载过多属性字段导致查询变慢,则需要考虑对字段进行拆分,创建多个维表。

  • 维表是否需要水平拆分。

如果记录之间有明显的界限,可以考虑拆成多个表或设计成多级分区。

  • 核心维表的产出时间。通常有严格的要求。

  • 维度属性尽可能的齐全

     ads层:(业务推动)

      

    实现流程

    理清需求,了解业务方对数据内容、使用方式(怎么交互的,报表、接口、即席查询、在线查询、指标查询、搜索)、性能的要求。

    盘点现有的数仓表是否可以支持,看以前有没有类似的需求,有没有可以复用的接口、报表什么的。

    代码实现,选择合适的存储引擎和查询引擎,配置线上监控然后交付。

    使用场景与性能
    • 针对业务方的使用场景,我们需要设计出高效,满足要求的ADS 层表;

    • 如果是多维分析,为了减少连接,提升性能,我们一般采用大宽表设计,使用高性能引擎支撑;

    • 如果是特定指标查询,一般采用KV的形式组织;

    • 如果是搜索场景,一般采用搜索引擎;

     

    数仓层级调用规范

     



    • 禁止反向依赖(如DWS->DWD)

    • ODS 只能被 DWD 调用。

    • DWD 可以被 DWS 和 ADS 调用。

    • DWS 只能被 ADS 调用。

    • 数据应用可以调用 DWD、DWM、DWS、ADS,但建议优先考虑使用汇总度高的数据。

    • ODS->DWD->DWS>ADS

    • ODS->DWD->ADS




    文章转载自大数据启示录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论