zl程序教程

您现在的位置是:首页 >  后端

当前栏目

9. 数仓开发之 DWD 层

开发 数仓 DWD
2023-06-13 09:12:27 时间

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

9. 数仓开发之 DWD 层

DWD层设计要点:

  • DWD 层的设计依据 : 维度建模理论,该层存储维度模型的事实表
  • DWD 层的数据存储格式 : orc 列式存储 + snappy 压缩
  • DWD 层表名的命名规范 : dwd_数据域_表名_单分区增量****全量标识( inc / full )

1. 交易域

数据域

业务过程

粒度

维度

度量

时间

用户

商品

地区

活动(具体规则)

优惠券

支付方式

退单类型

退单原因类型

渠道

设备

交易域

加购物车

一次加购物车的操作

商品件数

下单

一个订单中一个商品项

下单件数/下单原始金额/下单最终金额/活动优惠金额/优惠券优惠金额

取消订单

一次取消订单操作

下单件数/下单原始金额/下单最终金额/活动优惠金额/优惠券优惠金额

支付成功

一个订单中的一个商品项的支付成功操作

支付件数/支付原始金额/支付最终金额/活动优惠金额/优惠券优惠金额

退单

一次退单操作

退单件数/退单金额

退款成功

一次退款成功操作

退款件数/退款金额

1.1 加购事务事实表

购物车表(cart_info):

字段名

字段说明

类型

id

编号

bigint(20)

user_id

用户id

varchar(200)

sku_id

skuid

bigint(20)

cart_price

放入购物车时价格

decimal(10,2)

sku_num

数量

int(11)

img_url

图片文件

varchar(200)

sku_name

sku名称 (冗余)

varchar(200)

is_checked

int(1)

create_time

创建时间

datetime

operate_time

修改时间

datetime

is_ordered

是否已经下单

bigint(20)

order_time

下单时间

datetime

source_type

来源类型

varchar(20)

source_id

来源编号

bigint(20)

字典表(base_dic) :

建表

-- 加购事务事实表

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 ORC
    LOCATION '/warehouse/gmall/dwd/dwd_trade_cart_add_inc/'
    TBLPROPERTIES ('orc.compress' = 'snappy');

分区规划

数据流向

首日装载

-- 首日装载

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_cart_add_inc partition (dt)
select id,
       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') dt
from (
         select data.id,
                data.user_id,
                data.sku_id,
                data.create_time,
                data.source_id,
                data.source_type,
                data.sku_num
         from ods_cart_info_inc
         where dt = '2020-06-14'
           and type = 'bootstrap-insert'
     ) ci
         left join
     (
         select dic_code,
                dic_name
         from ods_base_dic_full
         where dt = '2020-06-14'
           and parent_code = '24'
     ) dic
     on
         ci.source_type = dic.dic_code;

每日装载

-- 每日装载

insert overwrite table dwd_trade_cart_add_inc partition(dt = '2020-06-15')
select
    id,
    user_id,
    sku_id,
    date_id,
    create_time,
    source_id,
    source_type_code,
    dic.dic_name source_type_name,
    sku_num
from (
         select data.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_num
         from ods_cart_info_inc
         where dt = '2020-06-15'
           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 (
    select dic_code,
           dic_name
    from ods_base_dic_full
    where dt = '2020-06-14'
      and parent_code = '24'
) dic
                   on cart.source_type_code = dic.dic_code;

1.2 下单事务事实表

订单明细表(order_detail)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单编号

bigint(20)

sku_id

sku_id

bigint(20)

sku_name

sku名称(冗余)

varchar(200)

img_url

图片名称(冗余)

varchar(200)

order_price

购买价格(下单时sku价格)

decimal(10,2)

sku_num

购买个数

bigint(20)

create_time

创建时间

datetime

source_type

来源类型

varchar(20)

source_id

来源编号

bigint(20)

split_total_amount

分摊总金额

decimal(16,2)

split_activity_amount

分摊活动减免金额

decimal(16,2)

split_coupon_amount

分摊优惠券减免金额

decimal(16,2)

订单表(order_info)

字段名

字段说明

类型

id

编号

bigint(20)

consignee

收货人

varchar(100)

consignee_tel

收件人电话

varchar(20)

total_amount

总金额

order_status

订单状态

varchar(20)

user_id

用户id

bigint(20)

payment_way

付款方式

varchar(20)

delivery_address

送货地址

varchar(1000)

order_comment

订单备注

varchar(200)

out_trade_no

订单交易编号(第三方支付用)

varchar(50)

trade_body

订单描述(第三方支付用)

varchar(200)

create_time

创建时间

datetime

operate_time

操作时间

datetime

expire_time

失效时间

datetime

process_status

进度状态

varchar(20)

tracking_no

物流单编号

varchar(100)

parent_order_id

父订单编号

bigint(20)

img_url

图片路径

varchar(200)

province_id

地区

int(20)

activity_reduce_amount

促销金额

decimal(16,2)

coupon_reduce_amount

优惠券

decimal(16,2)

original_total_amount

原价金额

decimal(16,2)

freight_fee

运费

decimal(16,2)

freight_fee_reduce

运费减免

decimal(16,2)

refundable_time

可退款日期(签收后30天)

datetime

订单明细活动关联表(order_detail_activity)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

activity_id

活动ID

bigint(20)

activity_rule_id

活动规则

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

订单明细优惠券关联表(order_detail_coupon)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

coupon_id

购物券ID

bigint(20)

coupon_use_id

购物券领用id

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

字典表(base_dic)

字段名

字段说明

类型

dic_code

编号

varchar(10)

dic_name

编码名称

varchar(100)

parent_code

父编号

varchar(10)

create_time

创建日期

datetime(0)

operate_time

修改日期

datetime(0)

建表

-- 交易域下单事务事实表

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 ORC
    LOCATION '/warehouse/gmall/dwd/dwd_trade_order_detail_inc/'
    TBLPROPERTIES ('orc.compress' = 'snappy');

首日装载

-- 首日装载 交易域下单事务事实表

set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_order_detail_inc
    partition (dt)
select od.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 (
         select data.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_amount
         from ods_order_detail_inc
         where dt = '2020-06-14'
           and type = 'bootstrap-insert'
     ) od
         left join (
    select data.id,
           data.user_id,
           data.province_id
    from ods_order_info_inc
    where dt = '2020-06-14'
      and type = 'bootstrap-insert'
) oi
                   on od.order_id = oi.id
         left join (
    select data.order_detail_id,
           data.activity_id,
           data.activity_rule_id
    from ods_order_detail_activity_inc
    where dt = '2020-06-14'
      and type = 'bootstrap-insert'
) act
                   on od.id = act.order_detail_id
         left join (
    select data.order_detail_id,
           data.coupon_id
    from ods_order_detail_coupon_inc
    where dt = '2020-06-14'
      and type = 'bootstrap-insert'
) cou
                   on od.id = cou.order_detail_id
         left join (
    select dic_name,
           dic_code
    from ods_base_dic_full
    where dt = '2020-06-14'
      and parent_code = '24'
) dic
                   on od.source_type = dic.dic_code;

每日装载

-- 每日装载 交易域下单事务事实表

insert overwrite table dwd_trade_order_detail_inc
    partition (dt = '2020-06-15')
select od.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 (
         select data.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_amount
         from ods_order_detail_inc
         where dt = '2020-06-15'
           and type = 'insert'
     ) od
         left join (
    select data.id,
           data.user_id,
           data.province_id
    from ods_order_info_inc
    where dt = '2020-06-15'
      and type = 'insert'
) oi
                   on od.order_id = oi.id
         left join (
    select data.order_detail_id,
           data.activity_id,
           data.activity_rule_id
    from ods_order_detail_activity_inc
    where dt = '2020-06-15'
      and type = 'insert'
) act
                   on od.id = act.order_detail_id
         left join (
    select data.order_detail_id,
           data.coupon_id
    from ods_order_detail_coupon_inc
    where dt = '2020-06-15'
      and type = 'insert'
) cou
                   on od.id = cou.order_detail_id
         left join (
    select dic_name,
           dic_code
    from ods_base_dic_full
    where dt = '2020-06-15'
      and parent_code = '24'
) dic
                   on od.source_type = dic.dic_code;

1.3 取消订单事务事实表

订单明细表(order_detail)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单编号

bigint(20)

sku_id

sku_id

bigint(20)

sku_name

sku名称(冗余)

varchar(200)

img_url

图片名称(冗余)

varchar(200)

order_price

购买价格(下单时sku价格)

decimal(10,2)

sku_num

购买个数

bigint(20)

create_time

创建时间

datetime

source_type

来源类型

varchar(20)

source_id

来源编号

bigint(20)

split_total_amount

分摊总金额

decimal(16,2)

split_activity_amount

分摊活动减免金额

decimal(16,2)

split_coupon_amount

分摊优惠券减免金额

decimal(16,2)

订单表(order_info)

字段名

字段说明

类型

id

编号

bigint(20)

consignee

收货人

varchar(100)

consignee_tel

收件人电话

varchar(20)

total_amount

总金额

order_status

订单状态

varchar(20)

user_id

用户id

bigint(20)

payment_way

付款方式

varchar(20)

delivery_address

送货地址

varchar(1000)

order_comment

订单备注

varchar(200)

out_trade_no

订单交易编号(第三方支付用)

varchar(50)

trade_body

订单描述(第三方支付用)

varchar(200)

create_time

创建时间

datetime

operate_time

操作时间

datetime

expire_time

失效时间

datetime

process_status

进度状态

varchar(20)

tracking_no

物流单编号

varchar(100)

parent_order_id

父订单编号

bigint(20)

img_url

图片路径

varchar(200)

province_id

地区

int(20)

activity_reduce_amount

促销金额

decimal(16,2)

coupon_reduce_amount

优惠券

decimal(16,2)

original_total_amount

原价金额

decimal(16,2)

freight_fee

运费

decimal(16,2)

freight_fee_reduce

运费减免

decimal(16,2)

refundable_time

可退款日期(签收后30天)

datetime

订单明细活动关联表(order_detail_activity)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

activity_id

活动ID

bigint(20)

activity_rule_id

活动规则

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

订单明细优惠券关联表(order_detail_coupon)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

coupon_id

购物券ID

bigint(20)

coupon_use_id

购物券领用id

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

字典表(base_dic)

字段名

字段说明

类型

dic_code

编号

varchar(10)

dic_name

编码名称

varchar(100)

parent_code

父编号

varchar(10)

create_time

创建日期

datetime(0)

operate_time

修改日期

datetime(0)

建表

首日装载

每日装载

1.4 支付成功事务事实表

支付表(payment_info)

字段名

字段说明

类型

id

编号

int(11)

out_trade_no

对外业务编号

varchar(50)

order_id

订单编号

bigint(50)

user_id

用户id

bigint(20)

payment_type

支付类型(微信 支付宝)

varchar(20)

trade_no

交易编号

varchar(50)

total_amount

支付金额

decimal(10,2)

subject

交易内容

varchar(200)

payment_status

支付状态

varchar(20)

create_time

创建时间

datetime

callback_time

回调时间

datetime

callback_content

回调信息

text

订单明细表(order_detail)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单编号

bigint(20)

sku_id

sku_id

bigint(20)

sku_name

sku名称(冗余)

varchar(200)

img_url

图片名称(冗余)

varchar(200)

order_price

购买价格(下单时sku价格)

decimal(10,2)

sku_num

购买个数

bigint(20)

create_time

创建时间

datetime

source_type

来源类型

varchar(20)

source_id

来源编号

bigint(20)

split_total_amount

分摊总金额

decimal(16,2)

split_activity_amount

分摊活动减免金额

decimal(16,2)

split_coupon_amount

分摊优惠券减免金额

decimal(16,2)

订单表(order_info)

字段名

字段说明

类型

id

编号

bigint(20)

consignee

收货人

varchar(100)

consignee_tel

收件人电话

varchar(20)

total_amount

总金额

order_status

订单状态

varchar(20)

user_id

用户id

bigint(20)

payment_way

付款方式

varchar(20)

delivery_address

送货地址

varchar(1000)

order_comment

订单备注

varchar(200)

out_trade_no

订单交易编号(第三方支付用)

varchar(50)

trade_body

订单描述(第三方支付用)

varchar(200)

create_time

创建时间

datetime

operate_time

操作时间

datetime

expire_time

失效时间

datetime

process_status

进度状态

varchar(20)

tracking_no

物流单编号

varchar(100)

parent_order_id

父订单编号

bigint(20)

img_url

图片路径

varchar(200)

province_id

地区

int(20)

activity_reduce_amount

促销金额

decimal(16,2)

coupon_reduce_amount

优惠券

decimal(16,2)

original_total_amount

原价金额

decimal(16,2)

freight_fee

运费

decimal(16,2)

freight_fee_reduce

运费减免

decimal(16,2)

refundable_time

可退款日期(签收后30天)

datetime

订单明细活动关联表(order_detail_activity)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

activity_id

活动ID

bigint(20)

activity_rule_id

活动规则

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

订单明细优惠券关联表(order_detail_coupon)

字段名

字段说明

类型

id

编号

bigint(20)

order_id

订单id

bigint(20)

order_detail_id

订单明细id

bigint(20)

coupon_id

购物券ID

bigint(20)

coupon_use_id

购物券领用id

bigint(20)

sku_id

skuID

bigint(20)

create_time

获取时间

datetime

字典表(base_dic)

字段名

字段说明

类型

dic_code

编号

varchar(10)

dic_name

编码名称

varchar(100)

parent_code

父编号

varchar(10)

create_time

创建日期

datetime(0)

operate_time

修改日期

datetime(0)

建表

首日装载

每日装载

1.5 退单事务事实表

建表

首日装载

每日装载

1.6 退款成功事务事实表

建表

首日装

每日装载

1.7 购物车周期快照事实表

建表

首日装载

每日装载

2. 工具域

数据域

业务过程

粒度

维度

度量

时间

用户

商品

地区

活动(具体规则)

优惠券

支付方式

退单类型

退单原因类型

渠道

设备

工具域

领取优惠券

一次优惠券领取操作

无事实(次数1)

使用优惠券(下单)

一次优惠券使用(下单)操作

无事实(次数1)

使用优惠券(支付)

一次优惠券使用(支付)操作

无事实(次数1)

2.1 优惠券领取事务事实表

建表

首日装载

每日装载

2.2 优惠券使用(下单)事务事实表

建表

首日装载

每日装载

2.3 优惠券使用(支付)事务事实表

建表

首日装载

每日装载

3. 互动域

数据域

业务过程

粒度

维度

度量

时间

用户

商品

地区

活动(具体规则)

优惠券

支付方式

退单类型

退单原因类型

渠道

设备

互动域

收藏商品

一次收藏商品操作

无事实(次数1)

评价

一次取消收藏商品操作

无事实(次数1)

3.1 收藏商品事务事实表

建表

首日装载

每日装载

3.2 评价事务事实表

建表

首日装载

每日装载

4. 流量域

数据域

业务过程

粒度

维度

度量

时间

用户

商品

地区

活动(具体规则)

优惠券

支付方式

退单类型

退单原因类型

渠道

设备

流量域

页面浏览

一次页面浏览记录

浏览时长

动作

一次动作记录

无事实(次数1)

曝光

一次曝光记录

无事实(次数1)

启动应用

一次启动记录

无事实(次数1)

错误

一次错误记录

无事实(次数1)

4.1 页面浏览事务事实表

建表

首日装载

每日装载

4.2 启动事务事实表

建表

首日装载

每日装载

4.3 动作事务事实表

建表

首日装载

每日装载

4.4 曝光事务事实表

建表

首日装载

每日装载

4.5 错误事务事实表

建表

首日装载

每日装载

5. 用户域

数据域

业务过程

粒度

维度

度量

时间

用户

商品

地区

活动(具体规则)

优惠券

支付方式

退单类型

退单原因类型

渠道

设备

用户域

注册

一次注册操作

无事实(次数1)

登录

一次登录操作

无事实(次数1)

5.1 用户注册事务事实表

建表

首日装载

每日装载

5.2 用户登录事务事实表

建表

首日装载

每日装载

6. 数据装载脚本

6.1 首日装载脚本

创建 ods_to_dwd_init.sh

vim ods_to_dwd_init.sh 

脚本执行权限

chmod 777 ods_to_dwd_init.sh 

6.2 每日装载脚本

创建 ods_to_dwd.sh

vim ods_to_dwd.sh 

脚本执行权限

chmod 777 ods_to_dwd.sh 

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