• 【数据仓库】数仓分层方法详解与层次调用规范


    一. 数仓分层的意义

    1. 清晰数据结构。

    每一个数据分层都有它的作用域,这样我们能根据自己的需求会快定位到要使用那些层的哪些表。

    例如:客户信息同时存在于核心系统、信贷系统、理财系统、资金系统,取数时该如何决策呢?数据仓库会对相同主题的数据进行统一建模,把复杂的数据关系梳理成条理清晰的数据模型,使用时就可避免上述问题了。

     

    2. 减少重复开发

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

    数据的逐层加工原则,下层包含了上层数据加工所需要的全量数据,这样的加工方式避免了每个数据开发人员**都重新从源系统抽取数据进行加工。**极大地减少不必要的数据冗余,也能实现计算结果复用,极大地降低存储和计算成本。

     

    3. 方便数据血缘追踪

    简单来说,最终给业务呈现的是一个能直接使用的业务表,但是它的数据来源有很多,如果有一张来源表出问题了,分层后的数仓能够快速准确地定位到问题,并清楚它的危害范围。
     

    4. 把复杂问题简单化

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

     

    5. 屏蔽原始数据的异常

    源头系统可能极为繁杂,而且表命名、字段命名 、字段含义等可能五花八门,通过 DW 层来规范和屏蔽所有这些复杂性。如果源头系统业务发生变更,相关的变更由 DW 层来处理,对下游用户透明,无须改动下游用户的代码和逻辑。

     

    6. 数据仓库的可维护性

    分层的设计使得某一层的问题只在该层得到解决,无须更改下一层的代码和逻辑。

     

    二. 如何进行数仓分层?

    数据分层最基础的分层思想将数据分为三个层:数据引入层(ODS)、数据仓库层(DW)和数据服务层(ADS)。可以基于基础分层之上添加新的层次,来满足不同的业务需求。
    在这里插入图片描述

    在这里插入图片描述

    1. ODS层

    数据引入层(ODS,Operational Data Store,又称数据基础层),是最接近数据源中数据的一层,这将原始数据几乎无处理地存放在数据仓库系统中,结构上与源系统基本保持一致

    这一层的主要职责是解决数据孤岛问题,保证数据集成完整性;数据与源系统表一致,体现非易失性;定期同步,增加表同步时间戳,体现时变性。

     
    ODS层数据的来源方式:

    • 业务库

    离线:hive、flink批模式、sqoop定时调度。
    实时:在实时方面, 可以考虑用canal监听mysql的binlog,实时接入即可。

    • 埋点日志

    • 线上系统会打入各种日志,这些日志一般以文件的形式保存,

    离线:用flume定时抽取。
    实时:用spark streaming或者Flink来实时接入存放到kafka中。

    • 消息队列:来自ActiveMQ、Kafka的数据等。

     

    2. DW层

    数仓层(DW, data warehouse)是核心设计的一层,本层将从 ODS 层中获得的数据按照主题建立各种数据模型,每一个主题对应一个宏观的分析领域,数据仓库层排除对决策无用的数据,提供特定主题的简明视图。在DW层会保存BI系统中所有的历史数据,例如保存10年的数据。

    DW存放明细事实数据、维表数据及公共指标汇总数据。

    1. 明细事实数据、维表数据一般根据ODS层数据加工生成。
    2. 公共指标汇总数据一般根据维表数据和明细事实数据加工生成。

     

    2.1. DW层分类

    DW层又可以细分为维度层(DIM)、明细数据层(DWD)和汇总数据层(DWS)

    分层作用:

    • 通过维度模型方法,可以定义维度模型主键与事实模型中外键关系,减少数据冗余,也提高明细数据表的易用性
    • 在汇总数据层同样可以关联复用统计粒度中的维度,采取更多的宽表化手段构建公共指标数据层,提升公共指标的复用性,减少重复加工

    分类:

    • 维度层(DIM,Dimension):以维度作为建模驱动,创建各维度表。为了避免在维度模型中冗余关联维度的属性,基于雪花模型构建维度表。
    • 明细数据层(DWD,Data Warehouse Detail):以业务过程作为建模驱动,构建最细粒度的明细事实表。
    • 汇总数据层(DWS,Data Warehouse Summary):以分析的主题对象作为建模驱动,基于上层的应用和产品的指标需求,构建公共粒度的汇总指标表。为上层提供公共指标,建立汇总宽表、明细事实表

     

    2.2. DWD层

    DWD层做了哪些事?

    1.数据清洗过滤

    去除废弃字段,去除格式错误的信息
    去除丢失了关键字段的信息
    过滤核心字段无意义的数据,比如订单表中订单id为null,支付表中支付id为空
    对手机号、身份证号等敏感数据脱敏

    2.数据映射,转换

    如boolean,有使用0 1标识,也有使用true false标识的
    如字符串空值,有使用"",也有使用null,的,统一为null即可
    如日期格式,这种就差异性更大,需要根据实际业务数据决定,不过一般都是格式化为YYYY-MM-dd HH:mm:ss 这类标准格式

     

    2.3. DWS

    DWS( data warehouse service)数据服务层,汇总层宽表

    DWS是根据DWD层基础数据按各个维度ID进行粗粒度汇总聚合,如按交易来源,交易类型进行汇合。整合汇总成分析某一个主题域的服务数据,一般是宽表。

    该层数据表会相对比较少,大多都是宽表(一张表会涵盖比较多的业务内容,表中的字段较多)。按照主题划分,如订单、用户等,生成字段比较多的宽表,用于提供后续的业务查询,OLAP分析,数据分发等。

    比如用户每个时间段在不同登录ip购买的商品数等。这里做一层轻度的汇总会让计算更加的高效,在此基础上如果计算7天、30天、90天的行为会快很多。80%的业务都能通过DWS层计算,而不是ODS。

     

    公共汇总事实表命名规范:

    dws_{业务板块缩写/pub}_{数据域缩写}_{数据粒度缩写}[_{自定义表命名标签缩写}]_{统计时间周期范围缩写}
    关于统计实际周期范围缩写,缺省情况下,离线计算应该包括最近一天(_1d),最近N天(_nd)和历史截至当天(_td)三个表。如果出现_nd的表字段过多需要拆分时,只允许以一个统计周期单元作为原子拆分。即一个统计周期拆分一个表,例如最近7天(_1w)拆分一个表。不允许拆分出来的一个表存储多个统计周期。

    对于小时表(无论是天刷新还是小时刷新),都用_hh来表示。对于分钟表(无论是天刷新还是小时刷新),都用_mm来表示。

    举例如下:

    dws_asale_trd_byr_subpay_1d(买家粒度交易分阶段付款一日汇总事实表)

    dws_asale_trd_byr_subpay_td(买家粒度分阶段付款截至当日汇总表)

    dws_asale_trd_byr_cod_nd(买家粒度货到付款交易汇总事实表)

    dws_asale_itm_slr_td(卖家粒度商品截至当日存量汇总表)

    dws_asale_itm_slr_hh(卖家粒度商品小时汇总表)—维度为小时

    dws_asale_itm_slr_mm(卖家粒度商品分钟汇总表)—维度为分钟

     

    3. ADS层

    数据应用层(ADS,Application Data Store)存放着数据产品个性化的统计指标数据,报表数据

    应用层主要是各个业务方或者部门基于DWD和DWS建立的数据集市(Data Market, DM),一般来说应用层的数据来源于DW层,而且相对于DW层,应用层只包含部门或者业务方面自己关心的明细层和汇总层的数据

    APP 层:为应用层,这层数据是完全为了满足具体的分析需求而构建的数据,也是星形或雪花结构的数据。如我们经常说的报表数据,或者说那种大宽表,一般就放在这里。包括前端报表、分析图表、KPI、仪表盘、OLAP、专题等分析,面向最终结果用户。

    应用层是根据业务需要,由前面三层数据统计而出的结果,可以直接提供查询展现,或导入至Mysql中使用。

     
     

    4、层次调用规范

    • 禁止反向调用

    • ODS 只能被 DWD 调用。

    • DWD 可以被 DWS 和 ADS 调用。

    • DWS 只能被 ADS 调用。

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

     
    参考:
    https://dbaplus.cn/news-73-4907-1.html

  • 相关阅读:
    LeetCode--2.两数相加
    时序数据库 TimescaleDB 基础概念
    世界坐标系、相机坐标系和图像坐标系的转换【详解】
    数据分析 第二周 (条形图,散点图,直方图,numpy运算和数组广播机制)笔记
    149. 直线上最多的点数-并查集做法
    Java课程设计:基于swing的贪吃蛇小游戏
    Qt 实现文字输入框,带字数限制
    STK12与Python联合仿真(一):环境搭建
    (附源码)计算机毕业设计SSM基于的二手车交易平台
    AI大模型:大数据+大算力+强算法
  • 原文地址:https://blog.csdn.net/hiliang521/article/details/134315246