数据仓库搭建之DWD层搭建

我们在设计项目中DWD层时,需要注意以下几点:

1)DWD层的设计依据维度建模理论,该层存储维度模型当中的事实表。

2)DWD层的数据存储格式为ORC列式存储结合snappy压缩。

3)DWD层表名的命名规范为dwd _ 数据域 _ 表名 _ 单分区增量全量标识(inc/full)

1.通过业务总线矩阵确定业务

我们根据之前构建的业务总线矩阵,来确定我们当前需要构建的事实表。

我们可以看到,我们在交易域当中所涉及到的业务过程有加购物车、下单、取消订单、支付成功、退单、退款成功六个业务过程,这六个业务过程对应着六张事务型事实表;流量域中所涉及到的业务过程有页面浏览、动作、曝光、启动应用以及错误五个业务过程,这五个业务过程对应着五张事务型事实表;用户域当中涉及到的业务过程有登录和注册,共两个业务过程,对应着两张事务型事实表;工具域当中有领取优惠券、使用优惠券(下单)和使用优惠券(支付)三个业务过程;在互动域当中有收藏商品和评价两个业务过程。

2.事实表设计

2.1交易域加购物车事务型事实表设计

2.1.1选择业务过程

业务过程为加购物车

2.1.2声明粒度

该表的粒度为每一行数据代表某个用户将某个商品加购物车的一次操作。

2.1.3确定维度

加购物车的操作所涉及到的维度有时间维度、用户维度和商品维度。(维度的确定由业务系统当中的逻辑决定)

2.1.4确定事实

加购物车的事实(度量值)为商品的件数。

2.1.5建表语句

DROP TABLE IF EXISTS dwd_trade_cart_add_inc;
CREATE EXTERNAL TABLE dwd_trade_cart_add_inc
(`id`               STRING COMMENT '编号',`user_id`          STRING COMMENT '用户id',`sku_id`           STRING COMMENT '商品id',`date_id`          STRING COMMENT '时间id',`create_time`      STRING COMMENT '加购时间',`source_id`        STRING COMMENT '来源类型ID',`source_type_code` STRING COMMENT '来源类型编码',`source_type_name` STRING COMMENT '来源类型名称',`sku_num`          BIGINT COMMENT '加购物车件数'
) COMMENT '交易域加购物车事务事实表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_cart_add_inc/'TBLPROPERTIES ('orc.compress' = 'snappy');

2.1.6数据装载

(1)数据的流向

(2)首日数据加载

我们进行首日装载时,由于需要将数据加载到不同日期的分区内,所以需要开启非严格模式。

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_cart_add_inc partition (dt)
selectid,user_id,sku_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,source_id,source_type,dic.dic_name,sku_num,date_format(create_time, 'yyyy-MM-dd')
from
(selectdata.id,data.user_id,data.sku_id,data.create_time,data.source_id,data.source_type,data.sku_numfrom ods_cart_info_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
)cart
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='24'
)dic
on cart.source_type=dic.dic_code;

(3)每日数据加载

insert overwrite table dwd_trade_cart_add_inc partition(dt='2022-05-02')
selectid,user_id,sku_id,date_id,create_time,source_id,source_type_code,source_type_name,sku_num
from
(selectdata.id,data.user_id,data.sku_id,date_format(from_utc_timestamp(ts*1000,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts*1000,'GMT+8'),'yyyy-MM-dd HH:mm:ss') create_time,data.source_id,data.source_type source_type_code,if(type='insert',data.sku_num,data.sku_num-old['sku_num']) sku_numfrom ods_cart_info_incwhere dt='2022-05-02'and (type='insert'or(type='update' and old['sku_num'] is not null and data.sku_num>cast(old['sku_num'] as int)))
)cart
left join
(selectdic_code,dic_name source_type_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='24'
)dic
on cart.source_type_code=dic.dic_code;

2.1.7关于from_unixtime(ts,format)和from_utc_timestamp(ts,timezone)

如何我们想将ts时间戳格式化,使用from_unixtime时,会将时区设置为UTC时区,这明显是错误的,因为我们的时间是北京时间。因此,我们需要使用from_utc_timestamp(ts,‘GMT+8’)将时间戳转换成北京时间(其中ts为整数的话,则认为它是毫秒)。

2.2交易域下单事务型事实表设计

2.2.1选择业务过程

业务过程为下单

2.1.2声明粒度

该表的粒度为每一行数据代表一个订单中的一个商品项。

2.2.3确定维度

下单的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度、活动维度和优惠券维度

2.2.4确定事实

下单的事实(度量值)有下单的件数、下单的原始金额、下单的最终金额、活动优惠金额和优惠券优惠金额

2.2.5建表语句

DROP TABLE IF EXISTS dwd_trade_order_detail_inc;
CREATE EXTERNAL TABLE dwd_trade_order_detail_inc
(`id`                    STRING COMMENT '编号',`order_id`              STRING COMMENT '订单id',`user_id`               STRING COMMENT '用户id',`sku_id`                STRING COMMENT '商品id',`province_id`           STRING COMMENT '省份id',`activity_id`           STRING COMMENT '参与活动规则id',`activity_rule_id`      STRING COMMENT '参与活动规则id',`coupon_id`             STRING COMMENT '使用优惠券id',`date_id`               STRING COMMENT '下单日期id',`create_time`           STRING COMMENT '下单时间',`source_id`             STRING COMMENT '来源编号',`source_type_code`      STRING COMMENT '来源类型编码',`source_type_name`      STRING COMMENT '来源类型名称',`sku_num`               BIGINT COMMENT '商品数量',`split_original_amount` DECIMAL(16, 2) COMMENT '原始价格',`split_activity_amount` DECIMAL(16, 2) COMMENT '活动优惠分摊',`split_coupon_amount`   DECIMAL(16, 2) COMMENT '优惠券优惠分摊',`split_total_amount`    DECIMAL(16, 2) COMMENT '最终价格分摊'
) COMMENT '交易域下单明细事务事实表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_order_detail_inc/'TBLPROPERTIES ('orc.compress' = 'snappy');

2.1.6数据装载

(1)数据的流向

(2)首日数据加载

涉及到的业务表有订单明细表、订单信息表、订单明细活动表、订单明细优惠券表以及字典表。

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_order_detail_inc partition (dt)
selectod.id,order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,date_format(create_time, 'yyyy-MM-dd') date_id,create_time,source_id,source_type,dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount,date_format(create_time,'yyyy-MM-dd')
from
(selectdata.id,data.order_id,data.sku_id,data.create_time,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) od
left join
(selectdata.id,data.user_id,data.province_idfrom ods_order_info_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) oi
on od.order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='24'
)dic
on od.source_type=dic.dic_code;

(3)每日数据加载

insert overwrite table dwd_trade_order_detail_inc partition (dt='2022-05-02')
selectod.id,order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,date_id,create_time,source_id,source_type,dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount
from
(selectdata.id,data.order_id,data.sku_id,date_format(data.create_time, 'yyyy-MM-dd') date_id,data.create_time,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere dt = '2022-05-02'and type = 'insert'
) od
left join
(selectdata.id,data.user_id,data.province_idfrom ods_order_info_incwhere dt = '2022-05-02'and type = 'insert'
) oi
on od.order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere dt = '2022-05-02'and type = 'insert'
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere dt = '2022-05-02'and type = 'insert'
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='24'
)dic
on od.source_type=dic.dic_code;

2.3交易域取消订单事务型事实表设计

2.3.1选择业务过程

业务过程为取消订单

2.3.2声明粒度

该表的粒度为每一行数据代表一次取消订单操作,具体为哪一个用户在什么时间对哪一个商品取消了订单,粒度精细到了取消订单中的每一种类的商品。

2.3.3确定维度

取消订单的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度、活动维度和优惠券维度

2.3.4确定事实

取消订单的事实(度量值)有下单的件数、下单的原始金额、下单的最终金额、活动优惠金额和优惠券优惠金额

2.3.5建表语句

DROP TABLE IF EXISTS dwd_trade_cancel_detail_inc;
CREATE EXTERNAL TABLE dwd_trade_cancel_detail_inc
(`id`                    STRING COMMENT '编号',`order_id`              STRING COMMENT '订单id',`user_id`               STRING COMMENT '用户id',`sku_id`                STRING COMMENT '商品id',`province_id`           STRING COMMENT '省份id',`activity_id`           STRING COMMENT '参与活动规则id',`activity_rule_id`      STRING COMMENT '参与活动规则id',`coupon_id`             STRING COMMENT '使用优惠券id',`date_id`               STRING COMMENT '取消订单日期id',`cancel_time`           STRING COMMENT '取消订单时间',`source_id`             STRING COMMENT '来源编号',`source_type_code`      STRING COMMENT '来源类型编码',`source_type_name`      STRING COMMENT '来源类型名称',`sku_num`               BIGINT COMMENT '商品数量',`split_original_amount` DECIMAL(16, 2) COMMENT '原始价格',`split_activity_amount` DECIMAL(16, 2) COMMENT '活动优惠分摊',`split_coupon_amount`   DECIMAL(16, 2) COMMENT '优惠券优惠分摊',`split_total_amount`    DECIMAL(16, 2) COMMENT '最终价格分摊'
) COMMENT '交易域取消订单明细事务事实表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_cancel_detail_inc/'TBLPROPERTIES ('orc.compress' = 'snappy');

2.3.6数据装载

(1)数据的流向

(2)首日数据加载

涉及到的业务表有订单明细表、订单信息表、订单明细活动表、订单明细优惠券表以及字典表。

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_cancel_detail_inc partition (dt)
selectod.id,order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,date_format(canel_time,'yyyy-MM-dd') date_id,canel_time,source_id,source_type,dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount,date_format(canel_time,'yyyy-MM-dd')
from
(selectdata.id,data.order_id,data.sku_id,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) od
join
(selectdata.id,data.user_id,data.province_id,data.operate_time canel_timefrom ods_order_info_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'and data.order_status='1003'
) oi
on od.order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='24'
)dic
on od.source_type=dic.dic_code;

(3)每日数据加载

insert overwrite table dwd_trade_cancel_detail_inc partition (dt='2022-05-02')
selectod.id,order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,date_format(canel_time,'yyyy-MM-dd') date_id,canel_time,source_id,source_type,dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount
from
(selectdata.id,data.order_id,data.sku_id,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere (dt='2022-05-02' or dt=date_add('2022-05-02',-1))and (type = 'insert' or type= 'bootstrap-insert')
) od
join
(selectdata.id,data.user_id,data.province_id,data.operate_time canel_timefrom ods_order_info_incwhere dt = '2022-05-02'and type = 'update'and data.order_status='1003'and array_contains(map_keys(old),'order_status')
) oi
on order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere (dt='2022-05-02' or dt=date_add('2022-05-02',-1))and (type = 'insert' or type= 'bootstrap-insert')
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere (dt='2022-05-02' or dt=date_add('2022-05-02',-1))and (type = 'insert' or type= 'bootstrap-insert')
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='24'
)dic
on od.source_type=dic.dic_code;

2.4交易域支付成功事务型事实表设计

2.4.1选择业务过程

业务过程为支付成功

2.4.2声明粒度

该表的粒度为每一行数据代表一个订单中的一个商品项的支付成功操作。

2.4.3确定维度

支付成功业务的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度、活动维度、优惠券维度以及支付方式维度。由于支付方式维度进行了维度退化,所以我们仅有其他六张维度表。

2.4.4确定事实

支付成功业务的事实(度量值)有支付的件数、支付的原始金额、支付的最终金额、活动优惠金额和优惠券优惠金额

2.4.5建表语句

DROP TABLE IF EXISTS dwd_trade_pay_detail_suc_inc;
CREATE EXTERNAL TABLE dwd_trade_pay_detail_suc_inc
(`id`                    STRING COMMENT '编号',`order_id`              STRING COMMENT '订单id',`user_id`               STRING COMMENT '用户id',`sku_id`                STRING COMMENT '商品id',`province_id`           STRING COMMENT '省份id',`activity_id`           STRING COMMENT '参与活动规则id',`activity_rule_id`      STRING COMMENT '参与活动规则id',`coupon_id`             STRING COMMENT '使用优惠券id',`payment_type_code`     STRING COMMENT '支付类型编码',`payment_type_name`     STRING COMMENT '支付类型名称',`date_id`               STRING COMMENT '支付日期id',`callback_time`         STRING COMMENT '支付成功时间',`source_id`             STRING COMMENT '来源编号',`source_type_code`      STRING COMMENT '来源类型编码',`source_type_name`      STRING COMMENT '来源类型名称',`sku_num`               BIGINT COMMENT '商品数量',`split_original_amount` DECIMAL(16, 2) COMMENT '应支付原始金额',`split_activity_amount` DECIMAL(16, 2) COMMENT '支付活动优惠分摊',`split_coupon_amount`   DECIMAL(16, 2) COMMENT '支付优惠券优惠分摊',`split_payment_amount`  DECIMAL(16, 2) COMMENT '支付金额'
) COMMENT '交易域成功支付事务事实表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_pay_detail_suc_inc/'TBLPROPERTIES ('orc.compress' = 'snappy');

2.4.6数据装载

(1)数据的流向

(2)首日数据加载

涉及到的业务表有订单明细表、支付信息表、订单信息表、订单明细活动表、订单明细优惠券表以及字典表。

insert overwrite table dwd_trade_pay_detail_suc_inc partition (dt)
selectod.id,od.order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,payment_type,pay_dic.dic_name,date_format(callback_time,'yyyy-MM-dd') date_id,callback_time,source_id,source_type,src_dic.dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount,date_format(callback_time,'yyyy-MM-dd')
from
(selectdata.id,data.order_id,data.sku_id,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) od
join
(selectdata.user_id,data.order_id,data.payment_type,data.callback_timefrom ods_payment_info_incwhere dt='2022-05-01'and type='bootstrap-insert'and data.payment_status='1602'
) pi
on od.order_id=pi.order_id
left join
(selectdata.id,data.province_idfrom ods_order_info_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) oi
on od.order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere dt = '2022-05-01'and type = 'bootstrap-insert'
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='11'
) pay_dic
on pi.payment_type=pay_dic.dic_code
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='24'
)src_dic
on od.source_type=src_dic.dic_code;

(3)每日数据加载

insert overwrite table dwd_trade_pay_detail_suc_inc partition (dt='2022-05-02')
selectod.id,od.order_id,user_id,sku_id,province_id,activity_id,activity_rule_id,coupon_id,payment_type,pay_dic.dic_name,date_format(callback_time,'yyyy-MM-dd') date_id,callback_time,source_id,source_type,src_dic.dic_name,sku_num,split_original_amount,split_activity_amount,split_coupon_amount,split_total_amount
from
(selectdata.id,data.order_id,data.sku_id,data.source_id,data.source_type,data.sku_num,data.sku_num * data.order_price split_original_amount,data.split_total_amount,data.split_activity_amount,data.split_coupon_amountfrom ods_order_detail_incwhere (dt = '2022-05-02' or dt = date_add('2022-05-02',-1))and (type = 'insert' or type = 'bootstrap-insert')
) od
join
(selectdata.user_id,data.order_id,data.payment_type,data.callback_timefrom ods_payment_info_incwhere dt='2022-05-02'and type='update'and array_contains(map_keys(old),'payment_status')and data.payment_status='1602'
) pi
on od.order_id=pi.order_id
left join
(selectdata.id,data.province_idfrom ods_order_info_incwhere (dt = '2022-05-02' or dt = date_add('2022-05-02',-1))and (type = 'insert' or type = 'bootstrap-insert')
) oi
on od.order_id = oi.id
left join
(selectdata.order_detail_id,data.activity_id,data.activity_rule_idfrom ods_order_detail_activity_incwhere (dt = '2022-05-02' or dt = date_add('2022-05-02',-1))and (type = 'insert' or type = 'bootstrap-insert')
) act
on od.id = act.order_detail_id
left join
(selectdata.order_detail_id,data.coupon_idfrom ods_order_detail_coupon_incwhere (dt = '2022-05-02' or dt = date_add('2022-05-02',-1))and (type = 'insert' or type = 'bootstrap-insert')
) cou
on od.id = cou.order_detail_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='11'
) pay_dic
on pi.payment_type=pay_dic.dic_code
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='24'
)src_dic
on od.source_type=src_dic.dic_code;

2.5交易域退单事务型事实表设计

2.5.1选择业务过程

业务过程为退单

2.5.2声明粒度

该表的粒度为每一行数据代表一次退单操作,代表的是某个用户在某个时间针对某个或某几件商品的退单操作。

2.5.3确定维度

退单的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度、退单类型、退单原因类型

2.5.4确定事实

退单业务的事实(度量值)有退单的件数、退单的金额

2.5.5建表语句

DROP TABLE IF EXISTS dwd_trade_order_refund_inc;
CREATE EXTERNAL TABLE dwd_trade_order_refund_inc
(`id`                      STRING COMMENT '编号',`user_id`                 STRING COMMENT '用户ID',`order_id`                STRING COMMENT '订单ID',`sku_id`                  STRING COMMENT '商品ID',`province_id`             STRING COMMENT '地区ID',`date_id`                 STRING COMMENT '日期ID',`create_time`             STRING COMMENT '退单时间',`refund_type_code`        STRING COMMENT '退单类型编码',`refund_type_name`        STRING COMMENT '退单类型名称',`refund_reason_type_code` STRING COMMENT '退单原因类型编码',`refund_reason_type_name` STRING COMMENT '退单原因类型名称',`refund_reason_txt`       STRING COMMENT '退单原因描述',`refund_num`              BIGINT COMMENT '退单件数',`refund_amount`           DECIMAL(16, 2) COMMENT '退单金额'
) COMMENT '交易域退单事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_order_refund_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.5.6数据装载

(1)数据的流向

(2)首日数据加载

涉及到的业务表有订单退单信息表、订单信息表、字典表。

insert overwrite table dwd_trade_order_refund_inc partition(dt)
selectri.id,user_id,order_id,sku_id,province_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,refund_type,type_dic.dic_name,refund_reason_type,reason_dic.dic_name,refund_reason_txt,refund_num,refund_amount,date_format(create_time,'yyyy-MM-dd')
from
(selectdata.id,data.user_id,data.order_id,data.sku_id,data.refund_type,data.refund_num,data.refund_amount,data.refund_reason_type,data.refund_reason_txt,data.create_timefrom ods_order_refund_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)ri
left join
(selectdata.id,data.province_idfrom ods_order_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)oi
on ri.order_id=oi.id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code = '15'
)type_dic
on ri.refund_type=type_dic.dic_code
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code = '13'
)reason_dic
on ri.refund_reason_type=reason_dic.dic_code;

(3)每日数据加载

insert overwrite table dwd_trade_order_refund_inc partition(dt='2022-05-02')
selectri.id,user_id,order_id,sku_id,province_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,refund_type,type_dic.dic_name,refund_reason_type,reason_dic.dic_name,refund_reason_txt,refund_num,refund_amount
from
(selectdata.id,data.user_id,data.order_id,data.sku_id,data.refund_type,data.refund_num,data.refund_amount,data.refund_reason_type,data.refund_reason_txt,data.create_timefrom ods_order_refund_info_incwhere dt='2022-05-02'and type='insert'
)ri
left join
(selectdata.id,data.province_idfrom ods_order_info_incwhere dt='2022-05-02'and type='update'and data.order_status='1005'and array_contains(map_keys(old),'order_status')
)oi
on ri.order_id=oi.id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code = '15'
)type_dic
on ri.refund_type=type_dic.dic_code
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code = '13'
)reason_dic
on ri.refund_reason_type=reason_dic.dic_code;

2.6交易域退款成功事务型事实表设计

2.6.1选择业务过程

业务过程为退款成功

2.6.2声明粒度

该表的粒度为每一行数据代表一次退款成功操作,代表的是某个用户在某个时间针对某个或某几件商品的退款成功操作。

2.6.3确定维度

退款成功的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度以及支付类型

2.6.4确定事实

退款成功业务的事实(度量值)有退款的件数和退款的金额

2.6.5建表语句

DROP TABLE IF EXISTS dwd_trade_refund_pay_suc_inc;
CREATE EXTERNAL TABLE dwd_trade_refund_pay_suc_inc
(`id`                STRING COMMENT '编号',`user_id`           STRING COMMENT '用户ID',`order_id`          STRING COMMENT '订单编号',`sku_id`            STRING COMMENT 'SKU编号',`province_id`       STRING COMMENT '地区ID',`payment_type_code` STRING COMMENT '支付类型编码',`payment_type_name` STRING COMMENT '支付类型名称',`date_id`           STRING COMMENT '日期ID',`callback_time`     STRING COMMENT '退款成功时间',`refund_num`        DECIMAL(16, 2) COMMENT '退款件数',`refund_amount`     DECIMAL(16, 2) COMMENT '退款金额'
) COMMENT '交易域提交退款成功事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_refund_pay_suc_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.6.6数据装载

(1)首日数据加载

涉及到的业务表有订单退款支付表、订单退单信息表、订单信息表、字典表。

insert overwrite table dwd_trade_refund_pay_suc_inc partition(dt)
selectrp.id,user_id,rp.order_id,rp.sku_id,province_id,payment_type,dic_name,date_format(callback_time,'yyyy-MM-dd') date_id,callback_time,refund_num,total_amount,date_format(callback_time,'yyyy-MM-dd')
from
(selectdata.id,data.order_id,data.sku_id,data.payment_type,data.callback_time,data.total_amountfrom ods_refund_payment_incwhere dt='2022-05-01'and type = 'bootstrap-insert'and data.refund_status='1602'
)rp
left join
(selectdata.id,data.user_id,data.province_idfrom ods_order_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)oi
on rp.order_id=oi.id
left join
(selectdata.order_id,data.sku_id,data.refund_numfrom ods_order_refund_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)ri
on rp.order_id=ri.order_id
and rp.sku_id=ri.sku_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='11'
)dic
on rp.payment_type=dic.dic_code;

(2)每日数据加载

insert overwrite table dwd_trade_refund_pay_suc_inc partition(dt='2022-05-02')
selectrp.id,user_id,rp.order_id,rp.sku_id,province_id,payment_type,dic_name,date_format(callback_time,'yyyy-MM-dd') date_id,callback_time,refund_num,total_amount
from
(selectdata.id,data.order_id,data.sku_id,data.payment_type,data.callback_time,data.total_amountfrom ods_refund_payment_incwhere dt='2022-05-02'and type = 'update'and array_contains(map_keys(old),'refund_status')and data.refund_status='1602'
)rp
left join
(selectdata.id,data.user_id,data.province_idfrom ods_order_info_incwhere dt='2022-05-02'and type='update'and data.order_status='1006'and array_contains(map_keys(old),'order_status')
)oi
on rp.order_id=oi.id
left join
(selectdata.order_id,data.sku_id,data.refund_numfrom ods_order_refund_info_incwhere dt='2022-05-02'and type='update'and data.refund_status='0705'and array_contains(map_keys(old),'refund_status')
)ri
on rp.order_id=ri.order_id
and rp.sku_id=ri.sku_id
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='11'
)dic
on rp.payment_type=dic.dic_code;

2.7交易域购物车周期快照事实表设计

2.7.1声明粒度

该表的粒度为每一行数据代表某用户的购物车中某件商品的件数。每日-用户-商品

2.7.2确定事实

事实(度量值)有商品的件数

2.7.3建表语句

DROP TABLE IF EXISTS dwd_trade_cart_full;
CREATE EXTERNAL TABLE dwd_trade_cart_full
(`id`       STRING COMMENT '编号',`user_id`  STRING COMMENT '用户id',`sku_id`   STRING COMMENT '商品id',`sku_name` STRING COMMENT '商品名称',`sku_num`  BIGINT COMMENT '加购物车件数'
) COMMENT '交易域购物车周期快照事实表'PARTITIONED BY (`dt` STRING)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_trade_cart_full/'TBLPROPERTIES ('orc.compress' = 'snappy');

2.7.4数据装载

(1)每日数据加载

涉及到的业务表有购物车信息表。

insert overwrite table dwd_trade_cart_full partition(dt='2022-05-01')
selectid,user_id,sku_id,sku_name,sku_num
from ods_cart_info_full
where dt='2022-05-01'
and is_ordered='0';

2.8流量域页面浏览事务型事实表设计

2.8.1选择业务过程

业务过程为页面浏览

2.8.2声明粒度

该表的粒度为每一行数据代表用户一次页面浏览的记录

2.8.3确定维度

页面浏览的操作所涉及到的维度有时间维度、用户维度、地区维度、渠道维度和设备维度

2.8.4确定事实

页面浏览的事实(度量值)浏览时长

2.8.5建表语句

DROP TABLE IF EXISTS dwd_traffic_page_view_inc;
CREATE EXTERNAL TABLE dwd_traffic_page_view_inc
(`province_id`    STRING COMMENT '省份id',`brand`          STRING COMMENT '手机品牌',`channel`        STRING COMMENT '渠道',`is_new`         STRING COMMENT '是否首次启动',`model`          STRING COMMENT '手机型号',`mid_id`         STRING COMMENT '设备id',`operate_system` STRING COMMENT '操作系统',`user_id`        STRING COMMENT '会员id',`version_code`   STRING COMMENT 'app版本号',`page_item`      STRING COMMENT '目标id ',`page_item_type` STRING COMMENT '目标类型',`last_page_id`   STRING COMMENT '上页类型',`page_id`        STRING COMMENT '页面ID ',`source_type`    STRING COMMENT '来源类型',`date_id`        STRING COMMENT '日期id',`view_time`      STRING COMMENT '跳入时间',`session_id`     STRING COMMENT '所属会话id',`during_time`    BIGINT COMMENT '持续时间毫秒'
) COMMENT '页面日志表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_traffic_page_view_inc'TBLPROPERTIES ('orc.compress' = 'snappy');

2.8.6数据装载

set hive.cbo.enable=false;
insert overwrite table dwd_traffic_page_view_inc partition (dt='2022-05-01')
selectprovince_id,brand,channel,is_new,model,mid_id,operate_system,user_id,version_code,page_item,page_item_type,last_page_id,page_id,source_type,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') view_time,concat(mid_id,'-',last_value(session_start_point,true) over (partition by mid_id order by ts)) session_id,during_time
from
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.is_new is_new,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_code,page.during_time,page.item page_item,page.item_type page_item_type,page.last_page_id,page.page_id,page.source_type,ts,if(page.last_page_id is null,ts,null) session_start_pointfrom ods_log_incwhere dt='2022-05-01'and page is not null
)log
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

2.9流量域启动事务事实表

2.9.1选择业务过程

业务过程为启动

2.9.2声明粒度

该表的粒度为每一行数据代表用户启动一次的记录

2.9.3确定维度

页面启动的操作所涉及到的维度有时间维度、用户维度、地区维度、渠道维度和设备维度

2.9.4确定事实

页面启动的事实(度量值)次数

2.9.5建表语句

DROP TABLE IF EXISTS dwd_traffic_start_inc;
CREATE EXTERNAL TABLE dwd_traffic_start_inc
(`province_id`     STRING COMMENT '省份id',`brand`           STRING COMMENT '手机品牌',`channel`         STRING COMMENT '渠道',`is_new`          STRING COMMENT '是否首次启动',`model`           STRING COMMENT '手机型号',`mid_id`          STRING COMMENT '设备id',`operate_system`  STRING COMMENT '操作系统',`user_id`         STRING COMMENT '会员id',`version_code`    STRING COMMENT 'app版本号',`entry`           STRING COMMENT 'icon手机图标 notice 通知',`open_ad_id`      STRING COMMENT '广告页ID ',`date_id`         STRING COMMENT '日期id',`start_time`      STRING COMMENT '启动时间',`loading_time_ms` BIGINT COMMENT '启动加载时间',`open_ad_ms`      BIGINT COMMENT '广告总共播放时间',`open_ad_skip_ms` BIGINT COMMENT '用户跳过广告时点'
) COMMENT '启动日志表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_traffic_start_inc'TBLPROPERTIES ('orc.compress' = 'snappy');

2.9.6数据装载

set hive.cbo.enable=false;
insert overwrite table dwd_traffic_start_inc partition(dt='2022-05-01')
selectprovince_id,brand,channel,is_new,model,mid_id,operate_system,user_id,version_code,entry,open_ad_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') action_time,loading_time,open_ad_ms,open_ad_skip_ms
from
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.is_new,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_code,`start`.entry,`start`.loading_time,`start`.open_ad_id,`start`.open_ad_ms,`start`.open_ad_skip_ms,tsfrom ods_log_incwhere dt='2022-05-01'and `start` is not null
)log
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

2.10流量域动作事务事实表

2.10.1选择业务过程

业务过程为动作

2.10.2声明粒度

该表的粒度为每一行数据代表用户完成一次动作的记录

2.10.3确定维度

页面浏览的操作所涉及到的维度有时间维度、用户维度、地区维度、渠道维度和设备维度

2.10.4确定事实

页面浏览的事实(度量值)次数

2.10.5建表语句

DROP TABLE IF EXISTS dwd_traffic_action_inc;
CREATE EXTERNAL TABLE dwd_traffic_action_inc
(`province_id`      STRING COMMENT '省份id',`brand`            STRING COMMENT '手机品牌',`channel`          STRING COMMENT '渠道',`is_new`           STRING COMMENT '是否首次启动',`model`            STRING COMMENT '手机型号',`mid_id`           STRING COMMENT '设备id',`operate_system`   STRING COMMENT '操作系统',`user_id`          STRING COMMENT '会员id',`version_code`     STRING COMMENT 'app版本号',`during_time`      BIGINT COMMENT '持续时间毫秒',`page_item`        STRING COMMENT '目标id ',`page_item_type`   STRING COMMENT '目标类型',`last_page_id`     STRING COMMENT '上页类型',`page_id`          STRING COMMENT '页面id ',`source_type`      STRING COMMENT '来源类型',`action_id`        STRING COMMENT '动作id',`action_item`      STRING COMMENT '目标id ',`action_item_type` STRING COMMENT '目标类型',`date_id`          STRING COMMENT '日期id',`action_time`      STRING COMMENT '动作发生时间'
) COMMENT '动作日志表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_traffic_action_inc'TBLPROPERTIES ('orc.compress' = 'snappy');

2.10.6数据装载

set hive.cbo.enable=false;
insert overwrite table dwd_traffic_action_inc partition(dt='2022-05-01')
selectprovince_id,brand,channel,is_new,model,mid_id,operate_system,user_id,version_code,during_time,page_item,page_item_type,last_page_id,page_id,source_type,action_id,action_item,action_item_type,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') action_time
from
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.is_new,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_code,page.during_time,page.item page_item,page.item_type page_item_type,page.last_page_id,page.page_id,page.source_type,action.action_id,action.item action_item,action.item_type action_item_type,action.tsfrom ods_log_inc lateral view explode(actions) tmp as actionwhere dt='2022-05-01'and actions is not null
)log
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

2.11流量域曝光事务事实表

2.11.1选择业务过程

业务过程为曝光

2.11.2声明粒度

该表的粒度为每一行数据代表用户完成一次曝光的记录

2.11.3确定维度

曝光的操作所涉及到的维度有时间维度、用户维度、商品维度、地区维度、活动维度、渠道维度和设备维度

2.11.4确定事实

曝光的事实(度量值)次数

2.11.5建表语句

DROP TABLE IF EXISTS dwd_traffic_display_inc;
CREATE EXTERNAL TABLE dwd_traffic_display_inc
(`province_id`       STRING COMMENT '省份id',`brand`             STRING COMMENT '手机品牌',`channel`           STRING COMMENT '渠道',`is_new`            STRING COMMENT '是否首次启动',`model`             STRING COMMENT '手机型号',`mid_id`            STRING COMMENT '设备id',`operate_system`    STRING COMMENT '操作系统',`user_id`           STRING COMMENT '会员id',`version_code`      STRING COMMENT 'app版本号',`during_time`       BIGINT COMMENT 'app版本号',`page_item`         STRING COMMENT '目标id ',`page_item_type`    STRING COMMENT '目标类型',`last_page_id`      STRING COMMENT '上页类型',`page_id`           STRING COMMENT '页面ID ',`source_type`       STRING COMMENT '来源类型',`date_id`           STRING COMMENT '日期id',`display_time`      STRING COMMENT '曝光时间',`display_type`      STRING COMMENT '曝光类型',`display_item`      STRING COMMENT '曝光对象id ',`display_item_type` STRING COMMENT 'app版本号',`display_order`     BIGINT COMMENT '曝光顺序',`display_pos_id`    BIGINT COMMENT '曝光位置'
) COMMENT '曝光日志表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_traffic_display_inc'TBLPROPERTIES ('orc.compress' = 'snappy');

2.11.6数据装载

set hive.cbo.enable=false;
insert overwrite table dwd_traffic_display_inc partition(dt='2022-05-01')
selectprovince_id,brand,channel,is_new,model,mid_id,operate_system,user_id,version_code,during_time,page_item,page_item_type,last_page_id,page_id,source_type,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') display_time,display_type,display_item,display_item_type,display_order,display_pos_id
from
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.is_new,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_code,page.during_time,page.item page_item,page.item_type page_item_type,page.last_page_id,page.page_id,page.source_type,display.display_type,display.item display_item,display.item_type display_item_type,display.`order` display_order,display.pos_id display_pos_id,tsfrom ods_log_inc lateral view explode(displays) tmp as displaywhere dt='2022-05-01'and displays is not null
)log
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

2.12流量域错误事务事实表

2.12.1选择业务过程

业务过程为错误

2.12.2声明粒度

该表的粒度为每一行数据代表一次错误的记录

2.12.3确定维度

错误的操作所涉及到的维度有时间维度、用户维度、渠道维度和设备维度

2.12.4确定事实

错误的事实(度量值)次数

2.12.5建表语句

DROP TABLE IF EXISTS dwd_traffic_error_inc;
CREATE EXTERNAL TABLE dwd_traffic_error_inc
(`province_id`     STRING COMMENT '地区编码',`brand`           STRING COMMENT '手机品牌',`channel`         STRING COMMENT '渠道',`is_new`          STRING COMMENT '是否首次启动',`model`           STRING COMMENT '手机型号',`mid_id`          STRING COMMENT '设备id',`operate_system`  STRING COMMENT '操作系统',`user_id`         STRING COMMENT '会员id',`version_code`    STRING COMMENT 'app版本号',`page_item`       STRING COMMENT '目标id ',`page_item_type`  STRING COMMENT '目标类型',`last_page_id`    STRING COMMENT '上页类型',`page_id`         STRING COMMENT '页面ID ',`source_type`     STRING COMMENT '来源类型',`entry`           STRING COMMENT 'icon手机图标  notice 通知',`loading_time`    STRING COMMENT '启动加载时间',`open_ad_id`      STRING COMMENT '广告页ID ',`open_ad_ms`      STRING COMMENT '广告总共播放时间',`open_ad_skip_ms` STRING COMMENT '用户跳过广告时点',`actions`         ARRAY<STRUCT<action_id:STRING,item:STRING,item_type:STRING,ts:BIGINT>> COMMENT '动作信息',`displays`        ARRAY<STRUCT<display_type :STRING,item :STRING,item_type :STRING,`order` :STRING,pos_id:STRING>> COMMENT '曝光信息',`date_id`         STRING COMMENT '日期id',`error_time`      STRING COMMENT '错误时间',`error_code`      STRING COMMENT '错误码',`error_msg`       STRING COMMENT '错误信息'
) COMMENT '错误日志表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_traffic_error_inc'TBLPROPERTIES ('orc.compress' = 'snappy');

2.12.6数据装载

set hive.cbo.enable=false;
set hive.execution.engine=mr;
insert overwrite table dwd_traffic_error_inc partition(dt='2022-05-01')
selectprovince_id,brand,channel,is_new,model,mid_id,operate_system,user_id,version_code,page_item,page_item_type,last_page_id,page_id,source_type,entry,loading_time,open_ad_id,open_ad_ms,open_ad_skip_ms,actions,displays,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') error_time,error_code,error_msg
from
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.is_new,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_code,page.during_time,page.item page_item,page.item_type page_item_type,page.last_page_id,page.page_id,page.source_type,`start`.entry,`start`.loading_time,`start`.open_ad_id,`start`.open_ad_ms,`start`.open_ad_skip_ms,actions,displays,err.error_code,err.msg error_msg,tsfrom ods_log_incwhere dt='2022-05-01'and err is not null
)log
join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

2.13工具域优惠券领取事务事实表

2.13.1选择业务过程

业务过程为优惠券领取

2.13.2声明粒度

该表的粒度为每一行数据代表一次优惠券领取的操作。

2.13.3确定维度

优惠券领取的操作所涉及到的维度有时间维度、用户维度以及优惠券维度

2.13.4确定事实

优惠券领取业务的没有事实,度量值为次数

2.13.5建表语句

DROP TABLE IF EXISTS dwd_tool_coupon_get_inc;
CREATE EXTERNAL TABLE dwd_tool_coupon_get_inc
(`id`        STRING COMMENT '编号',`coupon_id` STRING COMMENT '优惠券ID',`user_id`   STRING COMMENT 'userid',`date_id`   STRING COMMENT '日期ID',`get_time`  STRING COMMENT '领取时间'
) COMMENT '优惠券领取事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_tool_coupon_get_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.13.6数据装载

(1)首日数据加载

涉及到的业务表有优惠券表。

insert overwrite table dwd_tool_coupon_get_inc partition(dt)
selectdata.id,data.coupon_id,data.user_id,date_format(data.get_time,'yyyy-MM-dd') date_id,data.get_time,date_format(data.get_time,'yyyy-MM-dd')
from ods_coupon_use_inc
where dt='2022-05-01'
and type='bootstrap-insert';

(2)每日数据加载

insert overwrite table dwd_tool_coupon_get_inc partition (dt='2022-05-02')
selectdata.id,data.coupon_id,data.user_id,date_format(data.get_time,'yyyy-MM-dd') date_id,data.get_time
from ods_coupon_use_inc
where dt='2022-05-02'
and type='insert';

2.14工具域优惠券使用(下单)事务事实表

2.14.1选择业务过程

业务过程为优惠券使用(下单)

2.14.2声明粒度

该表的粒度为每一行数据代表一次优惠券使用(下单)的操作。

2.14.3确定维度

优惠券领取的操作所涉及到的维度有时间维度、用户维度以及优惠券维度

2.14.4确定事实

优惠券使用(下单)业务的没有事实,度量值为次数

2.14.5建表语句

DROP TABLE IF EXISTS dwd_tool_coupon_order_inc;
CREATE EXTERNAL TABLE dwd_tool_coupon_order_inc
(`id`         STRING COMMENT '编号',`coupon_id`  STRING COMMENT '优惠券ID',`user_id`    STRING COMMENT 'user_id',`order_id`   STRING COMMENT 'order_id',`date_id`    STRING COMMENT '日期ID',`order_time` STRING COMMENT '使用下单时间'
) COMMENT '优惠券使用下单事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_tool_coupon_order_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.14.6数据装载

(1)首日数据加载

涉及到的业务表有优惠券表。

insert overwrite table dwd_tool_coupon_order_inc partition(dt)
selectdata.id,data.coupon_id,data.user_id,data.order_id,date_format(data.using_time,'yyyy-MM-dd') date_id,data.using_time,date_format(data.using_time,'yyyy-MM-dd')
from ods_coupon_use_inc
where dt='2022-05-01'
and type='bootstrap-insert'
and data.using_time is not null;

(2)每日数据加载

insert overwrite table dwd_tool_coupon_order_inc partition(dt='2022-05-02')
selectdata.id,data.coupon_id,data.user_id,data.order_id,date_format(data.using_time,'yyyy-MM-dd') date_id,data.using_time
from ods_coupon_use_inc
where dt='2022-05-02'
and type='update'
and array_contains(map_keys(old),'using_time');

2.15工具域优惠券使用(支付)事务事实表

2.15.1选择业务过程

业务过程为优惠券使用(支付)

2.15.2声明粒度

该表的粒度为每一行数据代表一次优惠券使用(支付)的操作。

2.15.3确定维度

优惠券使用(支付)的操作所涉及到的维度有时间维度、用户维度以及优惠券维度

2.15.4确定事实

优惠券使用(支付)业务的没有事实,度量值为次数

2.15.5建表语句

DROP TABLE IF EXISTS dwd_tool_coupon_pay_inc;
CREATE EXTERNAL TABLE dwd_tool_coupon_pay_inc
(`id`           STRING COMMENT '编号',`coupon_id`    STRING COMMENT '优惠券ID',`user_id`      STRING COMMENT 'user_id',`order_id`     STRING COMMENT 'order_id',`date_id`      STRING COMMENT '日期ID',`payment_time` STRING COMMENT '使用下单时间'
) COMMENT '优惠券使用支付事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_tool_coupon_pay_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.15.6数据装载

(1)首日数据加载

涉及到的业务表有优惠券表。

insert overwrite table dwd_tool_coupon_pay_inc partition(dt)
selectdata.id,data.coupon_id,data.user_id,data.order_id,date_format(data.used_time,'yyyy-MM-dd') date_id,data.used_time,date_format(data.used_time,'yyyy-MM-dd')
from ods_coupon_use_inc
where dt='2022-05-01'
and type='bootstrap-insert'
and data.used_time is not null;

(2)每日数据加载

insert overwrite table dwd_tool_coupon_pay_inc partition(dt='2020-06-15')
selectdata.id,data.coupon_id,data.user_id,data.order_id,date_format(data.used_time,'yyyy-MM-dd') date_id,data.used_time
from ods_coupon_use_inc
where dt='2022-05-02'
and type='update'
and array_contains(map_keys(old),'used_time');

2.16互动域收藏商品事务事实表

2.16.1选择业务过程

业务过程为收藏商品

2.16.2声明粒度

该表的粒度为每一行数据代表某个用户的一次收藏商品的操作。

2.16.3确定维度

收藏商品的操作所涉及到的维度有时间维度、用户维度以及商品维度

2.16.4确定事实

收藏商品业务的没有事实,度量值为次数

2.16.5建表语句

DROP TABLE IF EXISTS dwd_interaction_favor_add_inc;
CREATE EXTERNAL TABLE dwd_interaction_favor_add_inc
(`id`          STRING COMMENT '编号',`user_id`     STRING COMMENT '用户id',`sku_id`      STRING COMMENT 'sku_id',`date_id`     STRING COMMENT '日期id',`create_time` STRING COMMENT '收藏时间'
) COMMENT '收藏事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_interaction_favor_add_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.16.6数据装载

(1)首日数据加载

涉及到的业务表有favor_info表。

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_interaction_favor_add_inc partition(dt)
selectdata.id,data.user_id,data.sku_id,date_format(data.create_time,'yyyy-MM-dd') date_id,data.create_time,date_format(data.create_time,'yyyy-MM-dd')
from ods_favor_info_inc
where dt='2022-05-01'
and type = 'bootstrap-insert';

(2)每日数据加载

insert overwrite table dwd_interaction_favor_add_inc partition(dt='2022-05-02')
selectdata.id,data.user_id,data.sku_id,date_format(data.create_time,'yyyy-MM-dd') date_id,data.create_time
from ods_favor_info_inc
where dt='2022-05-02'
and type = 'insert';

2.17互动域评价事务事实表

2.17.1选择业务过程

业务过程为评价商品

2.17.2声明粒度

该表的粒度为每一行数据代表某个用户对订单中的某一个商品进行评价的操作。

2.17.3确定维度

评价商品的操作所涉及到的维度有时间维度、用户维度以及商品维度

2.17.4确定事实

评价商品业务的没有事实,度量值为次数

2.17.5建表语句

DROP TABLE IF EXISTS dwd_interaction_comment_inc;
CREATE EXTERNAL TABLE dwd_interaction_comment_inc
(`id`            STRING COMMENT '编号',`user_id`       STRING COMMENT '用户ID',`sku_id`        STRING COMMENT 'sku_id',`order_id`      STRING COMMENT '订单ID',`date_id`       STRING COMMENT '日期ID',`create_time`   STRING COMMENT '评价时间',`appraise_code` STRING COMMENT '评价编码',`appraise_name` STRING COMMENT '评价名称'
) COMMENT '评价事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_interaction_comment_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.17.6数据装载

(1)首日数据加载

涉及到的业务表有comment_info表和字典表。

insert overwrite table dwd_interaction_comment_inc partition(dt)
selectid,user_id,sku_id,order_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,appraise,dic_name,date_format(create_time,'yyyy-MM-dd')
from
(selectdata.id,data.user_id,data.sku_id,data.order_id,data.create_time,data.appraisefrom ods_comment_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)ci
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-01'and parent_code='12'
)dic
on ci.appraise=dic.dic_code;

(2)每日数据加载

insert overwrite table dwd_interaction_comment_inc partition(dt='2022-05-02')
selectid,user_id,sku_id,order_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,appraise,dic_name
from
(selectdata.id,data.user_id,data.sku_id,data.order_id,data.create_time,data.appraisefrom ods_comment_info_incwhere dt='2022-05-02'and type='insert'
)ci
left join
(selectdic_code,dic_namefrom ods_base_dic_fullwhere dt='2022-05-02'and parent_code='12'
)dic
on ci.appraise=dic.dic_code;

2.18用户域用户注册事务事实表

2.18.1选择业务过程

业务过程为用户注册

2.18.2声明粒度

该表的粒度为每一行数据代表用户的一次注册的操作。

2.18.3确定维度

用户注册的操作所涉及到的维度有时间维度、用户维度、地区维度、设备维度以及渠道维度

2.18.4确定事实

用户注册业务的没有事实,度量值为次数

2.18.5建表语句

DROP TABLE IF EXISTS dwd_user_register_inc;
CREATE EXTERNAL TABLE dwd_user_register_inc
(`user_id`        STRING COMMENT '用户ID',`date_id`        STRING COMMENT '日期ID',`create_time`    STRING COMMENT '注册时间',`channel`        STRING COMMENT '应用下载渠道',`province_id`    STRING COMMENT '省份id',`version_code`   STRING COMMENT '应用版本',`mid_id`         STRING COMMENT '设备id',`brand`          STRING COMMENT '设备品牌',`model`          STRING COMMENT '设备型号',`operate_system` STRING COMMENT '设备操作系统'
) COMMENT '用户域用户注册事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_user_register_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.18.6数据装载

(1)首日数据加载

涉及到的业务表有用户信息表、日志表以及省份表。

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_user_register_inc partition(dt)
selectui.user_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,channel,province_id,version_code,mid_id,brand,model,operate_system,date_format(create_time,'yyyy-MM-dd')
from
(selectdata.id user_id,data.create_timefrom ods_user_info_incwhere dt='2022-05-01'and type='bootstrap-insert'
)ui
left join
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_codefrom ods_log_incwhere dt='2022-05-01'and page.page_id='register'and common.uid is not null
)log
on ui.user_id=log.user_id
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on log.area_code=bp.area_code;

(2)每日数据加载

insert overwrite table dwd_user_register_inc partition(dt='2022-05-02')
selectui.user_id,date_format(create_time,'yyyy-MM-dd') date_id,create_time,channel,province_id,version_code,mid_id,brand,model,operate_system
from
(selectdata.id user_id,data.create_timefrom ods_user_info_incwhere dt='2022-05-02'and type='insert'
)ui
left join
(selectcommon.ar area_code,common.ba brand,common.ch channel,common.md model,common.mid mid_id,common.os operate_system,common.uid user_id,common.vc version_codefrom ods_log_incwhere dt='2022-05-02'and page.page_id='register'and common.uid is not null
)log
on ui.user_id=log.user_id
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-02'
)bp
on log.area_code=bp.area_code;

2.19用户域用户登录事务事实表

2.19.1选择业务过程

业务过程为用户登录

2.19.2声明粒度

该表的粒度为每一行数据代表用户一次登录的操作。

2.19.3确定维度

用户登录的操作所涉及到的维度有时间维度、用户维度、地区维度、商品维度、优惠券维度、设备维度以及渠道维度

2.19.4确定事实

用户登录业务的没有事实,度量值为次数

2.19.5建表语句

DROP TABLE IF EXISTS dwd_user_login_inc;
CREATE EXTERNAL TABLE dwd_user_login_inc
(`user_id`        STRING COMMENT '用户ID',`date_id`        STRING COMMENT '日期ID',`login_time`     STRING COMMENT '登录时间',`channel`        STRING COMMENT '应用下载渠道',`province_id`    STRING COMMENT '省份id',`version_code`   STRING COMMENT '应用版本',`mid_id`         STRING COMMENT '设备id',`brand`          STRING COMMENT '设备品牌',`model`          STRING COMMENT '设备型号',`operate_system` STRING COMMENT '设备操作系统'
) COMMENT '用户域用户登录事务事实表'PARTITIONED BY (`dt` STRING)STORED AS ORCLOCATION '/warehouse/gmall/dwd/dwd_user_login_inc/'TBLPROPERTIES ("orc.compress" = "snappy");

2.14.6数据装载

insert overwrite table dwd_user_login_inc partition(dt='2022-05-01')
selectuser_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd') date_id,date_format(from_utc_timestamp(ts,'GMT+8'),'yyyy-MM-dd HH:mm:ss') login_time,channel,province_id,version_code,mid_id,brand,model,operate_system
from
(selectuser_id,channel,area_code,version_code,mid_id,brand,model,operate_system,tsfrom(selectuser_id,channel,area_code,version_code,mid_id,brand,model,operate_system,ts,row_number() over (partition by session_id order by ts) rnfrom(selectuser_id,channel,area_code,version_code,mid_id,brand,model,operate_system,ts,concat(mid_id,'-',last_value(session_start_point,true) over(partition by mid_id order by ts)) session_idfrom(selectcommon.uid user_id,common.ch channel,common.ar area_code,common.vc version_code,common.mid mid_id,common.ba brand,common.md model,common.os operate_system,ts,if(page.last_page_id is null,ts,null) session_start_pointfrom ods_log_incwhere dt='2022-05-01'and page is not null)t1)t2where user_id is not null)t3where rn=1
)t4
left join
(selectid province_id,area_codefrom ods_base_province_fullwhere dt='2022-05-01'
)bp
on t4.area_code=bp.area_code;

10.数据仓库搭建之DWD层搭建相关推荐

  1. 11.数据仓库搭建之DWS层搭建

    数据仓库搭建之DWS层搭建 在搭建该层时,我们需要注意的是: 1)本层的设计主要参考指标体系 2)DWS层数据的数据存储格式为orc列式存储+snappy压缩. 3)DWS层表名的命名规范为:dws ...

  2. 离线数仓 (十三) --------- DWD 层搭建

    目录 前言 一.DWD 层 (用户行为日志) 1. 日志解析思路 2. get_json_object 函数使用 3. 启动日志表 4. 页面日志表 5. 动作日志表 6. 曝光日志表 7. 错误日志 ...

  3. 电商平台数据仓库搭建02-Hadoop集群搭建

    1,项目说明 本项目来源于github 电商平台数据仓库搭建 . 项目为个人学习记录,项目代码及文件可访问 电商平台数据仓库搭建 获得. 2,项目准备 虚拟机准备 虚拟机开发工具为 VMware15. ...

  4. 数据仓库搭建DWD层

    本篇只是DWD层,其他内容请关注我的博客!在<项目>专栏里!!! 本篇文章参考尚硅谷大数据项目写成! 目录 一.用户行为日志 1.1日志格式 1.2get_json_object函数使用 ...

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

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

  6. 数仓搭建——DWD层

    1 DWD层(用户行为日志) 1.1 日志解析思路 页面埋点日志 启动日志 思路 1.2 get_json_object函数使用 数据 [{"name":"大郎" ...

  7. (37)DWD 层(业务数据)

    业务数据方面 DWD 层的搭建主要注意点在于维度建模,减少后续大量 Join 操作. 1. 商品维度表(全量) 商品维度表主要是将商品表 SKU 表.商品一级分类.商品二级分类.商品三级分类. 商品品 ...

  8. 数据仓库之【商品订单数据数仓】02:【dwd层】

    一.分析 针对ods层表中的数据进行清洗,参考数据清洗规则,按照实际情况对数据进行清洗. 由于数据库中的数据都是比较规整的,其实可以直接迁移到dwd层,不过为了以防万一,还是对ods层的数据进行过滤, ...

  9. 数据仓库之【用户行为数仓】06:【dwd层】明细数据层:清洗ods层之后的数据

    一.dwd层分析 下面我们来创建dwd层: 针对ods层表中的数据进行清洗,参考数据清洗规则,按照实际情况对数据进行清洗. 注意:如果清洗规则使用SQL可以实现,那么就使用SQL实现数据清洗,如果清洗 ...

最新文章

  1. 【Python】青少年蓝桥杯_每日一题_12.19_输出三位数
  2. 网址收藏 plc实现
  3. Linux 系统上出现^H
  4. 洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
  5. MapReduce运行机制
  6. Hive记录-Hive on Spark环境部署
  7. tomcat classpath两个路径_solr安装-tomcat+solrCloud构建稳健solr集群
  8. 03-24 CPU 统计
  9. Java字符串中数据排序
  10. 4、RH850 F1 定时器OSTM功能和配置
  11. RADASM中使用DOSBOX来运行DOS/BIOS程序(16位)
  12. 计算机局域网络硬件组成,计算机基础知识:局域网网络硬件的组成
  13. java定义一个周长类三角形_point类 三点的三角形的周长、面积 编程求解矩形和圆面积 java 三角形的定义...
  14. 01.电脑黑客基本知识
  15. 苹果cmsV10仿优酷模板,最新自适应苹果cms模板
  16. 基于属性的测试,hypothesis以及查找bug
  17. 利用amWiki轻松打造知识库或技术文档系统
  18. endnote修改正文中参考文献标注_Endnote修改参考文献格式
  19. python评论情感分析毕业设计_使用文本挖掘技术进行小说《圣墟》评论的情感分析——基于python...
  20. 顺丰速运扩大全球业务范围,正式进军新西兰市场

热门文章

  1. 遥感数据下载——FIRM:VIIRS火点数据、MODIS火点数据简介及下载
  2. 新必应(new bing)申请
  3. laravel软连接访问文件失效解决办法php artisan storage:link
  4. 计算机公式乘法字处理,字符串乘法
  5. 2019年初面试题汇总
  6. 学生环境网页设计模板下载 保护环境大学生HTML网页制作作品 简单环境网页设计成品 dreamweaver学生网站模板
  7. mac微信怎么设置代理服务器,微信Mac版怎么管理群成员?微信Mac版管理群成员的方法...
  8. Python爬虫实战--(四)爬取58同城的商品数据
  9. 字节跳动,收割海外大厂员工
  10. @Transactional是什么意思