数据仓库之DWD层

数据仓库之DWD层DWD(DataWareHouseDetail)数据明细层,主要是将从业务数据库中同步过来的ODS层数据进行清洗和整合成相应的事实表。事实表作为数据仓库维度建模的核心,需要紧紧围绕着业务过程来设计。在拿到业务系统的表结构后,进行大概的梳理,再与业务方沟通整个业务过程的流转过程,对业务的整个生命周期进行分析,明确关键的业务步骤,在能满足业务需求的前提下,尽可能设计出更通用的模型。业务方有时只仅仅只是考虑了当下的情况。例如业务想要一个审核通过人员的明细数据,我们设计了一个全量的审核明细表,过了几天,业务

大家好,又见面了,我是你们的朋友全栈君。

DWD(Data WareHouse Detail)数据明细层,主要是将从业务数据库中同步过来的ODS层数据进行清洗和整合成相应的事实表。事实表作为数据仓库维度建模的核心,需要紧紧围绕着业务过程来设计。在拿到业务系统的表结构后,进行大概的梳理,再与业务方沟通整个业务过程的流转过程,对业务的整个生命周期进行分析,明确关键的业务步骤,在能满足业务需求的前提下,尽可能设计出更通用的模型。

业务方有时只仅仅只是考虑了当下的情况。例如业务想要一个审核通过人员的明细数据,我们设计了一个全量的审核明细表,过了几天,业务方又想要分析审核流程中每个环节的转化情况,我们又要设计一张增量的明细表。一张表就可以满足需要的事被弄成了两张,而如果放弃前一张表一方面否定了自己之前的工作,另一方面所有依赖的下游都需要变更取数逻辑,增加了工作量;不放弃表的数量增加,数据就有了两个逻辑出口,统一口径和数据管理也成为一个问题。而这一切都可以在模型设计前期与业务沟通的过程中避免。因此我们在与业务沟通时,一方面了解整个业务周期过程,另一方面要考虑的是从业务方的角度来,分析当下业务需求和未来潜在的需求,尽量做到一次设计,全面覆盖。

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

(一)事务事实表

事务事实表,主要分两种单事务事实表和多事务事实表。

1.单事务事实表

针对单个业务过程而设计一个事实表。这样的设计可以对每个业务过程进行单独分析,并且对于业务方而言,符合其逻辑认知,使用起来没有障碍。

2.多事务事实表

单事务事实表比较容易实现,但也有一定的缺点。1.在多个业务过程在维度和粒度一致的前提下,且业务过程维度较多而事实相对少的情况下,我们每个业务过程都需要去join关联维度,一方面存储量增加,另一方面多次重复的join维度带来的存储计算量也会增加。2.多个业务过程多张表,随着业务发展,表的数量明细资产太多不方便管理。所以就有了多事务事实表。

我们使用多事务事实表来替代单事务事实表需要明白3个问题 1.如何同时记录多个业务过程的信息(多事务的实现)?2.如何进行单个业务过程的统计分析(成为单事务事实表的替代品)?3.什么时候可以使用多事务事实表(多事务的局限性)?

针对第一个问题,一般而言针主要做法是对每个业务过程的度量都使用一个字段进行保存 ,即不同的事实使用不同的字段进行存放;如果不是当前业务过程的度量,则采取零值处理方式。这样我们取每个实例最新的一条记录就可以看到该实例截止到统计日期的业务进度。

针对第二个问题,单事务事实表一般用来分析无非从两方面入手,一个是明细数据,二是统计数据,统计某个时间区间内的事务发生频率,例如最近一周的下单数量。明细数据在多事务事实表中也会保存,而统计数据,我们需要对每个业务过程都设置一个是否当天完成的字段来解决。我们可以统计周期区间内有多少个当天完成作为统计结果。

针对第三个问题,1.多事务事实表中的多个业务过程其粒度和维度必须是一致的。如果粒度不一致则没办法整合在一起。2. 多事务事实表当实例没有在一天完结,则会存在多条数据,如果需要统计每个实例的业务过程时长或者要看每个实例的最新状态,需要筛选所有数据最新的数据,再对每条数据进行计算,比较消耗性能。

这里在给出多事务表在具体设计时的操作,传统的多事务表可能会一个业务过程一条数据,只有当前发生的业务过程有相应数据,其他数据均置零。假如一天一个实体有多个业务过程发生,我们应该有几条数据。这里有两种做法,一个是每个业务过程都有一条数据,非当前业务过程的度量都置零。这样的好处是我们统计度量时可以直接sum或者其他操作。另一种方式是保留最新业务过程之前的业务过程的所有度量,这样总条数会减少(同一天可能多个业务过程都完成),但是统计时必须要加上是否当天的标记来过滤再统计(保证一个业务过程只有一条记录有效)。

事务事实表区别:

单事务事实表 多事务事实表
业务过程 一个 多个
粒度 相互之间不相关 相同粒度
维度 相互之间不相关 一致
事实 只取当前业务过程中的事实,且需要为可累加事实 保留多个业务过程巾的事实, 非当前业务过程中的事实需要置零处理,且需要为可累加事实
冗余维度 多个业务过程 , 则需要冗余多次 不同的业务过程只需要冗余一次(记录次数<=业务过程数)
理解程度 易于理解,不会混淆 难以理解 , 需要通过标签来限定
计算存储成本 较多 , 每个业务过程都需要计算 较少 , 不同业务过程融合到一起 , 降低了储存计算量, 但是会存在大量零值。

(二)累计快照事实表

为了解决多事务事实表第三个问题的第二点,能不能有一张表保存实例所有的最新状态,这样我们就不需要每次统计全量数据都要取全量去重取最新数据进行计算统计。这其实就是累计快照事实表的产生。将所有实例都只保存最新的状态。其实现方式可以以拉链表的方式来实现,以事务表中历史最新数据作为初始数据,每天更新其中的数据。这样既可以保存一份全量数据,并且可以在表的基础上计算相关的业务时长。

但这也导致一个问题,数据量太大。如果每天都存储全量最新,我们必须要将表的生命周期设置相比较而言小一点。

(三)周期快照事实表

事务事实表主要储存的都是可累加行的度量。当需要一些状态度量时,比如账户余额、买卖家星级 、 商品库存、卖家累积交易额等,事务事实表就不太适合。就需要周期快照事实表。我们按照一定的周期进行汇总。周期快照事实表产出方式1.对于可以通过对事务表聚集的数据,从事务事实表中汇总得到,但是这样可能逻辑比较复杂。2.无法聚集的数据,从操作系统中以快照的方式同步下到ods层,再在进行加工。

表之间的关系图:

数据仓库之DWD层

总结

数据明细层是下游计算各种信息的基础,数据资产的底层建设,我们在设计时,尽量设计通用的模型。针对不同的业务需求,采用不同的表设计,本篇仅介绍了相关表的概念和逻辑,具体设计过程,要针对具体业务再展开。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/153221.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【Linux】open函数的参数和作用

    【Linux】open函数的参数和作用一、open函数用来干什么open函数在Linux下一般用来打开或者创建一个文件,我们可以根据参数来定制我们需要的文件的属性和用户权限等各种参数。二、open函数的定义和参数我们首先来看下open函数在Linux下的定义#include#include#includeintopen(constchar*pathnam

    2022年5月26日
    44
  • java百分比或带百分号的数字转成double或Bigdecimal格式[通俗易懂]

    java百分比或带百分号的数字转成double或Bigdecimal格式[通俗易懂]java百分比或带百分号的数字转成double或Bigdecimal格式

    2022年4月23日
    345
  • java获取当前时间到毫秒_java获取当前时间毫秒

    java获取当前时间到毫秒_java获取当前时间毫秒()为获取当前系统时间,也可使用当前时间戳获取时间戳三种方法执行效率比较:importjava.util.Calendar;importjava.util.Date;publicclassTimeTest{……java获得系统时间转换成字符串关键字:java有时候经常用到JAVA时间转换如字符串转换成时间,时间转换成字符串1.long字符串转换成…

    2022年9月5日
    2
  • mac配置环境变量不生效

    mac配置环境变量不生效mac修改环境变量原理:主要原因是每次终端启动时候zsh加载的是/etc/zshrc文件,而‘zshrc’文件中并没有定义任务环境变量。cd/etc/vizshrc最后一行添加:source~/.bash_profile保存,重新打开终端即可…

    2022年6月21日
    178
  • pycharm激活码(破解版激活)

    pycharm激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    139
  • java中instanceof用法

    java中instanceof用法java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。用法:result=objectinstanceofclass参数:Result:布尔类型。Object:必选项。任意对象表达式。Class:必选项。任意已定义的对象类。说明:如果object是cla

    2022年7月13日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号