从0到1搭建数仓DWD层案例实践
一、DWD层结构


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

二、DWD层-事务型事实表

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 parquetlocation '/warehouse/gmall/dwd/dwd_fact_payment_info/'tblproperties ("parquet.compression"="lzo");
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_idfrom(select * from ods_payment_info where dt='2021-05-03')pijoin(select id, province_id from ods_order_info where dt='2021-05-03')oion pi.order_id = oi.id;
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 parquetlocation '/warehouse/gmall/dwd/dwd_fact_order_refund_info/'tblproperties ("parquet.compression"="lzo");
直接从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_timefrom ods_order_refund_infowhere dt='2021-05-03';
三、DW层-周期型快照事实表
1、周期型快照事实表的概念

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 parquetlocation '/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_idfrom ods_cart_infowhere dt='2020-06-14';
4、收藏事实表
收藏事实表的操作和加购事实表一样,从时间、商品、用户三个维度来创建表。
四、DWD层-累积型快照事实表
我们以优惠券领用事实表为例。首先要了解优惠卷的生命周期:领取优惠卷——>用优惠卷下单——>优惠卷参与支付
累积型快照事实表使用:统计优惠卷领取次数、优惠卷下单次数、优惠卷参与支付次数。

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 parquetlocation '/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 '使用时间(支付)'

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_usewhere dt='2021-05-03';

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'))oldfull outer join(selectid,coupon_id,user_id,order_id,coupon_status,get_time,using_time,used_timefrom ods_coupon_usewhere dt='2021-05-04')newon old.id=new.id;
其他类似的累积型事实表也是这个操作思路。
这样我们就完成了DWD层业务数据的建模和设计、搭建和使用包括简要的SQL代码的编写。
现在我们来总结一下:
DWD层是对事实表的处理,代表的是业务的最小粒度层。任何数据的记录都可以从这一层获取,为后续的DWS和DWT层做准备。DWD层是站在选择好事实表的基础上,对维度建模的视角,这层维度建模主要做的4个步骤:选择业务过程、声明粒度、确认维度、确认事实。
数据仓库第4版 数据仓库工具箱 DAMA数据管理知识体系指南 华为数据之道
评论
