关注公众号:大数据技术派,回复资料,领取1024G资料。

然后点击右上角 “设为星标”

比别人更快接收好文章


导读:数仓架构(ods-dwd-dws-ads)每一层之前我们已经分享过很多干货了,但dwd却还没有。今天这篇文章主要讲解数仓dwd层业务事实数据的搭建、解析、加载与案例实践。

往期干货:

数仓建模—指标体系

数仓建模分层理论

数仓建模—宽表的设计

数仓建模方法论

数仓架构发展史

一、DWD层结构

DWD层是对用户的日志行为事实进行解析,以及对交易业务数据采用维度模型的方式重新建模(即维度退化)。

1、回顾DWD层概念

我们在来回顾一下对DWD层(Data Warehouse Detail)的定义:“明细粒度事实层:是以业务过程来作为建模驱动,基于每个具体的业务过程特点,构建最细粒度的明细层事实表(注意是最细粒度)。需要结合企业的数据使用特点,将明细事实表的某些重要维度属性字段做适当冗余,即宽表化处理。明细粒度事实层的表通常也被称为逻辑事实表。”

2、DWD层建模4步骤

DWD层是事实建模层,这层建模主要做的4个步骤:

我们目前已经完成了:

2.1、选择业务过程

选择了事实表,比如:订单事实表、支付事实表等;

2.2、声明粒度

即确认每一行数据是什么,要保证事实表的最小粒度。

2.3、确认维度

在前面两节中我们确定了6个维度;比如时间、用户、地点、商品、优惠券、活动这6个维度。思路是其他ODS层表的维度需要向这6个维度进行退化到DIM层,这样做的母的是减少后期的大量表之间的join操作。

6个维度表的退化操作其实我们在前面的第十二章节已经做了即DIM层。除了第3张表即商品维度表是5个表退化到1张表上,其他都是1-2张表退化到1张表上,相对比较简单。

2.4、确认事实

就是确认事实表的每张事实表的度量值。

下面我们根据事实表的加载方式来选择几个实战操作一下。

二、DWD层-事务型事实表

关于事实表分类,我们在数仓关系建模和维度建模,里面说过,分为6类事实表。

1、事务型事实表的概念

适用于不会发生变化的业务。业务表的同步策略是增量同步。以每个事务或事件为单位,例如一个销售订单记录,一笔支付记录等,作为事实表里的一行数据。一旦事务被提交,事实表数据被插入,数据就不再进行更改,其更新方式为增量更新。

8张表里面包含:支付事实表、评价事实表、退款事实表、订单明细(详情)事实表

2、解析思路

根据事实表(行),选择不同的维度(列)来建表。

3、支付事实表(事务型事实表)

需要时间、用户、地区三个维度,查看ODS层表ods_payment_info,发现没有地区维度字段。所以通过ods_order_info表关联做join获取该字段。

3.1、建表语句

drop table if exists dwd_fact_payment_info;
create external table dwd_fact_payment_info (`id` string COMMENT 'id',`out_trade_no` string COMMENT '对外业务编号',`order_id` string COMMENT '订单编号',`user_id` string COMMENT '用户编号',`alipay_trade_no` string COMMENT '支付宝交易流水编号',`payment_amount`    decimal(16,2) COMMENT '支付金额',`subject`         string COMMENT '交易内容',`payment_type` string COMMENT '支付类型',`payment_time` string COMMENT '支付时间',`province_id` string COMMENT '省份ID'
) COMMENT '支付事实表表'
PARTITIONED BY (`dt` string)
stored as parquet
location '/warehouse/gmall/dwd/dwd_fact_payment_info/'
tblproperties ("parquet.compression"="lzo");

3.2、装载语句

province_id省份ID这个字段通过 ods_order_info表做join获取

SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
insert overwrite table dwd_fact_payment_info partition(dt='2021-05-03')
selectpi.id,pi.out_trade_no,pi.order_id,pi.user_id,pi.alipay_trade_no,pi.total_amount,pi.subject,pi.payment_type,pi.payment_time,oi.province_id
from
(select * from ods_payment_info where dt='2021-05-03'
)pi
join
(select id, province_id from ods_order_info where dt='2021-05-03'
)oi
on pi.order_id = oi.id;

4、退款事实表(事务型事实表)

需要时间、用户、商品三个维度,查看ODS层表ods_order_refund_info,所有字段都有,那么直接取数装载。

4.1、创建表

drop table if exists dwd_fact_order_refund_info;
create external table dwd_fact_order_refund_info(`id` string COMMENT '编号',`user_id` string COMMENT '用户ID',`order_id` string COMMENT '订单ID',`sku_id` string COMMENT '商品ID',`refund_type` string COMMENT '退款类型',`refund_num` bigint COMMENT '退款件数',`refund_amount` decimal(16,2) COMMENT '退款金额',`refund_reason_type` string COMMENT '退款原因类型',`create_time` string COMMENT '退款时间'
) COMMENT '退款事实表'
PARTITIONED BY (`dt` string)
stored as parquet
location '/warehouse/gmall/dwd/dwd_fact_order_refund_info/'
tblproperties ("parquet.compression"="lzo");

4.2、装载时间

直接从ODS层查到数据后装载。

insert overwrite table dwd_fact_order_refund_info partition(dt='2021-05-03')
selectid,user_id,order_id,sku_id,refund_type,refund_num,refund_amount,refund_reason_type,create_time
from ods_order_refund_info
where dt='2021-05-03';

5、评价事实表、订单明细事实表(事务型事实表)

都和上面“退款事实表”处理方法一样,并且所有字段均从ODS层ods_comment_info直接获取。你是否可以自己创建呢?

三、DW层-周期型快照事实表

1、周期型快照事实表的概念

周期型快照事实表,表中不会保留所有数据,只保留固定时间间隔的数据,例如每天或者每月的销售额或每月的账户余额等。例如购物车,有加减商品,随时都有可能变化,但是我们更关心每天结束时这里面有多少商品,方便我们后期统计分析。相当于每天一个全量快照,业务表的同步策略是全量同步。

2、解析思路

每天做一次快照,导入的数据是全量,区别于事务型事实表是每天导入新增。

存储的数据比较讲究时效性,时间太久了的意义不大,可以删除以前的数据。

3、加购事实表(周期型快照事实表)

3.1、创建表结构

所有字段ODS层,fact_cart_info表都有。

drop table if exists dwd_fact_cart_info;
create external table dwd_fact_cart_info(`id` string COMMENT '编号',`user_id` string  COMMENT '用户id',`sku_id` string  COMMENT 'skuid',`cart_price` string  COMMENT '放入购物车时价格',`sku_num` string  COMMENT '数量',`sku_name` string  COMMENT 'sku名称 (冗余)',`create_time` string  COMMENT '创建时间',`operate_time` string COMMENT '修改时间',`is_ordered` string COMMENT '是否已经下单。1为已下单;0为未下单',`order_time` string  COMMENT '下单时间',`source_type` string COMMENT '来源类型',`srouce_id` string COMMENT '来源编号'
) COMMENT '加购事实表'
PARTITIONED BY (`dt` string)
stored as parquet
location '/warehouse/gmall/dwd/dwd_fact_cart_info/'
tblproperties ("parquet.compression"="lzo");

3.2、装载数据

insert overwrite table dwd_fact_cart_info partition(dt='2021-05-03')
selectid,user_id,sku_id,cart_price,sku_num,sku_name,create_time,operate_time,is_ordered,order_time,source_type,source_id
from ods_cart_info
where dt='2020-06-14';

4、收藏事实表

收藏事实表的操作和加购事实表一样,从时间、商品、用户三个维度来创建表。

四、DWD层-累积型快照事实表

1、累积型快照事实表的概念

累积型快照事实表,用于周期性发生变化的业务,即需要周期性的跟踪业务事实的变化。例如:数据仓库中可能需要累积或者存储订单从下订单开始,到订单商品被打包、运输、和签收的各个业务阶段的时间点数据来跟踪订单声明周期的进展情况。当这个业务过程进行时,事实表的记录也要不断更新。

业务表的同步策略是新增以及变化同步。

2、解析思路

我们以优惠券领用事实表为例。首先要了解优惠卷的生命周期:领取优惠卷——>用优惠卷下单——>优惠卷参与支付

累积型快照事实表使用:统计优惠卷领取次数、优惠卷下单次数、优惠卷参与支付次数。

3、优惠券领用事实表(累积型快照事实表)

3.1、创建表结构

drop table if exists dwd_fact_coupon_use;
create external table dwd_fact_coupon_use(`id` string COMMENT '编号',`coupon_id` string  COMMENT '优惠券ID',`user_id` string  COMMENT 'userid',`order_id` string  COMMENT '订单id',`coupon_status` string  COMMENT '优惠券状态',`get_time` string  COMMENT '领取时间',`using_time` string  COMMENT '使用时间(下单)',`used_time` string  COMMENT '使用时间(支付)'
) COMMENT '优惠券领用事实表'
PARTITIONED BY (`dt` string)
stored as parquet
location '/warehouse/gmall/dwd/dwd_fact_coupon_use/'
tblproperties ("parquet.compression"="lzo");

注意:这里dt是按照优惠卷领用时间get_time做为分区

`get_time` string  COMMENT '领取时间',
`using_time` string  COMMENT '使用时间(下单)',
`used_time` string  COMMENT '使用时间(支付)'

3.2装载数据

首日装载分析

首日装载SQL代码,注意是动态分区。

insert overwrite table dwd_coupon_use partition(dt)
selectid,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_time,expire_time,coalesce(date_format(used_time,'yyyy-MM-dd'),date_format(expire_time,'yyyy-MM-dd'),'9999-99-99')
from ods_coupon_use
where dt='2021-05-03';

每日装载思路分析

SQL代码

set hive.exec.dynamic.partition.mode=nonstrict;
set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
insert overwrite table dwd_fact_coupon_use partition(dt)
selectif(new.id is null,old.id,new.id),if(new.coupon_id is null,old.coupon_id,new.coupon_id),if(new.user_id is null,old.user_id,new.user_id),if(new.order_id is null,old.order_id,new.order_id),if(new.coupon_status is null,old.coupon_status,new.coupon_status),if(new.get_time is null,old.get_time,new.get_time),if(new.using_time is null,old.using_time,new.using_time),if(new.used_time is null,old.used_time,new.used_time),date_format(if(new.get_time is null,old.get_time,new.get_time),'yyyy-MM-dd')
from
(selectid,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_timefrom dwd_fact_coupon_usewhere dt in(selectdate_format(get_time,'yyyy-MM-dd')from ods_coupon_usewhere dt='2021-05-04')
)old
full outer join
(selectid,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_timefrom ods_coupon_usewhere dt='2021-05-04'
)new
on old.id=new.id;

其他类似的累积型事实表也是这个操作思路。

这样我们就完成了DWD层业务数据的建模和设计、搭建和使用包括简要的SQL代码的编写。

现在我们来总结一下:

DWD层是对事实表的处理,代表的是业务的最小粒度层。任何数据的记录都可以从这一层获取,为后续的DWS和DWT层做准备。DWD层是站在选择好事实表的基础上,对维度建模的视角,这层维度建模主要做的4个步骤:选择业务过程、声明粒度、确认维度、确认事实。


参考书籍:

  1. 数据仓库第4版

  2. 数据仓库工具箱

  3. DAMA数据管理知识体系指南

  4. 华为数据之道

猜你喜欢
数仓建模—指标体系
数仓建模—宽表的设计
Spark SQL知识点与实战
Hive计算最大连续登陆天数
Flink计算pv和uv的通用方法

从0到1搭建数仓DWD层案例实践相关推荐

  1. 数仓(六)从0到1简单搭建数仓ODS层(埋点日志 + 业务数据)

    数仓(一)简介数仓,OLTP和OLAP 数仓(二)关系建模和维度建模 数仓(三)简析阿里.美团.网易.恒丰银行.马蜂窝5家数仓分层架构 数仓(四)数据仓库分层 数仓(五)元数据管理系统解析 最近工作一 ...

  2. 数仓(十)从0到1简单搭建加载数仓DWS层

    数仓(一)简介数仓,OLTP和OLAP 数仓(二)关系建模和维度建模 数仓(三)简析阿里.美团.网易.恒丰银行.马蜂窝5家数仓分层架构 数仓(四)数据仓库分层 数仓 (五) 元数据管理系统解析 数仓( ...

  3. 一个人可以搭建数仓吗

    一个人可以搭建数仓吗? 以下只是当前个人的感想,随着时间和成长,也许观点横看成林侧成峰,只是作为本人的心路历程,有什么错误欢迎交流和指出 如果非要个确切的答案,我觉得不可以. 不求原因,回答到现在就结 ...

  4. Flink SQL搭建实时数仓DWD层

    1.实时数仓DWD层 DWD是明细数据层,该层的表结构和粒度与原始表保持一致,不过需要对ODS层数据进行清洗.维度退化.脱敏等,最终得到的数据是干净的,完整的.一致的数据. (1)对用户行为数据解析. ...

  5. 数仓ADS层指标计算案例分享

    数仓ADS层指标计算案例分享 ADS层数据往往是最终的结果指标数据,在大屏展示,或者实时流处理时候使用,通过下面两个例子来练习业务大屏展示sql该怎么写. 1. 会员分析案例 1.1 数据准备 表结构 ...

  6. Apache Doris在美团外卖数仓中的应用实践

    来自:美团技术团队 美团外卖数据仓库通过MOLAP+ROLAP双引擎模式来适配不同应用场景.MOLAP引擎使用了Apache Kylin.ROLAP我们经过综合考虑,选择了Apache Doris.本 ...

  7. 数仓 DW层中主题表之页面交互事件概况主题(分享,点赞,收藏)

    数仓 DW层中主题表之页面交互事件概况主题(分享,点赞,收藏) 1. 背景 在大数据开发中,本身的数据处理分析目的一般就是2类,一个是基于现有数据找出规律,做总结和分类统计.一个是基于现有数据找出规律 ...

  8. 数仓 DW层 用户留存分析主题

    数仓 DW层 用户留存分析主题 1. 背景 在app运营和产品设计中,一般都是拉新和留存2个最关键指标来衡量对用户的吸引力程度. 拉新,顾名思义, 拉新用户进来 留存,顾名思义,让用户留下来,这里面有 ...

  9. 【实时数仓】DWD层需求分析及实现思路、idea环境搭建、实现DWD层处理用户行为日志的功能

    文章目录 一 DWD层需求分析及实现思路 1 分层需求分析 2 每层的职能 3 DWD层职能详细介绍 (1)用户行为日志数据 (2)业务数据 4 DWD层数据准备实现思路 二 环境搭建 1 创建mav ...

最新文章

  1. Unity3D架构之PureMVC
  2. 万维网发布服务 w3svc 已停止 除非万维_W3C万维网联盟宣布停止发布HTML 5.3版
  3. SPI配置8通道ADC128S022
  4. AngularJS路由使用案例
  5. 目录页码错误未定义书签怎么解决_目录页码对不齐应该怎么办?这2种方法,工作效率大增...
  6. ssl问题解决的过程
  7. app服务器不运行了,springmvc app URL在本地运行,但不在服务器上运行
  8. Android 系统(240)---底层如何简易的获取一个从AP传下来的parameter(flag)
  9. DartWeb基础—简单入门
  10. FlexDisPlayRoom正在发货「可在线玩弄」
  11. 空间分析——SatScan软件简明教程
  12. 深入理解JVM - 虚拟机字节码指令集
  13. 1.1你是谁?你从哪来?你到哪去? -交给学习来解答
  14. Linux下C语言调用paly播放音频文件
  15. ES6——TDZ(暂时性死区)
  16. 22考研全程时间计划安排表!
  17. 增值税怎么用计算机算,什么是汽车税费计算器?我们如何通过网上使用这种计算器呢?...
  18. iOS8.0 使用Photos.framework对相册的常用操作
  19. 装X与务实并存!iPad越狱必装插件汇总
  20. 科技百咖 | 对话智达方通CEO蔡志宏:“多维数据仓库”是企业业务管理的未来...

热门文章

  1. ubuntu挂载硬盘是什么意思
  2. 制片人、出品人、监制、特别出演分别指的是什么?
  3. Android - ProGuard简介
  4. matlab中for循环,while循环的基本使用。
  5. WIN10 2004 打印机无法共享的设置办法
  6. RDP 协议组件 X.224 在协议流中发现一个错误并且中断了客户端连接
  7. 学生环境网页设计模板下载 保护环境大学生HTML网页制作作品 简单环境网页设计成品 dreamweaver学生网站模板
  8. 【GXOI/GZOI2019】逼死强迫症(生成函数)
  9. python中的screen blit_python pygame blit。获取要显示的图像
  10. iomanip部分函数功能,流操作的控制