【离线数仓-8-数据仓库开发DWD层-交易域相关事实表】

news2024/9/29 18:13:55

离线数仓-8-数据仓库开发DWD层-交易域相关事实表

  • 离线数仓-8-数据仓库开发DWD层-交易域相关事实表
    • 一、DWD层设计要点
    • 二、交易域相关事实表
      • 1.交易域加购事务事实表
        • 1.加购事务事实表 前期梳理
        • 2.加购事务事实表 DDL表设计分析
        • 3.加购事务事实表 加载数据分析
          • 1.首日全量加购的数据加载
          • 2.每日增量加购的数据加载
      • 2.交易域下单事务事实表
        • 1.下单事务事实表 前期梳理
        • 2.下单事务事实表 DDL表设计分析
        • 3.下单事务事实表 加载数据分析
          • 1.首日全量下单的数据加载
          • 2.每日增量量下单的数据加载
      • 3.交易域取消订单事务事实表
        • 1.取消订单事务事实表 前期梳理
        • 2.取消订单事务事实表 DDL表设计分析
        • 3.取消订单事务事实表 加载数据分析
          • 1.首日全量取消订单的数据加载
          • 2.每日增量取消订单的数据加载
      • 7.交易域购物车周期快照事实表
        • 1.购物车周期快照事实表 前期梳理
        • 2.购物车周期快照事实表 DDL表设计分析
        • 3.购物车周期快照事实表 加载数据分析
      • 4.交易域支付成功事务事实表
        • 1.支付成功事务事实表 前期梳理
        • 2.支付成功事务事实表 DDL表设计分析
        • 3.支付成功事务事实表 加载数据分析
      • 5.交易域退单事务事实表
        • 1.退单事务事实表 前期梳理
        • 2.退单事务事实表 DDL表设计分析
        • 3.退单事务事实表 加载数据分析
      • 6.交易域退款成功事务事实表
        • 1.退款成功事务事实表 前期梳理
        • 2.退款成功事务事实表 DDL表设计分析
        • 3.退款成功事务事实表 加载数据分析

离线数仓-8-数据仓库开发DWD层-交易域相关事实表

一、DWD层设计要点

  • DWD层设计要点:
    • 1)DWD层的设计依据是维度建模理论,该层存储维度模型的事实表。
      • 事实表维度建模理论参考之前整理资料:https://blog.csdn.net/weixin_38136584/article/details/129137583?spm=1001.2014.3001.5501
    • 2)DWD层的数据存储格式为orc列式存储+snappy压缩。
    • 3)DWD层表名的命名规范为dwd_数据域_表名(体现业务过程)_单分区增量全量标识(inc/full)

二、交易域相关事实表

事实事务表设计流程大概分为4步:选择业务过程 --> 声明粒度 --> 确认维度–> 确认事实

1.交易域加购事务事实表

1.加购事务事实表 前期梳理

  • 加购事务事实表 设计流程跟事务事实表流程一致,分为四步进行。
  • 查看之前梳理的业务矩阵,基于业务矩阵来进行设计流程4步骤分析在这里插入图片描述
    • 1.选择业务过程:加购物车
    • 2.声明粒度(业务过程确定后,需要为每个业务过程声明粒度。即精确定义每张事务型事实表的每行数据表示什么,应该尽可能选择最细粒度,以此来应各种细节程度的需求。):xx人在xx时间将xx商品加入到购物车
    • 3.确认维度:寻找符合业务逻辑的并与此业务过程关联的维度,如果前期选择少了几个维度,后期可以更新表格再添加即可。
    • 4.确认事实(每个业务过程的度量值):商品件数

2.加购事务事实表 DDL表设计分析

  • 业务数据库对应的表格加购物车cart_info中,存在source_id字段,此字段对应的是加购物车这个操作对应的数据来源,所以需要加来源相关的信息添加到维度表中,此处做了维度弱化,直接将数据整合到加购事务事实表中了。
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');

3.加购事务事实表 加载数据分析

  • 1.加购事务事实表,来自于业务数据库中哪些表格,对应同步到ods层,事务事实表使用的是inc结尾的增量数据,full结尾的全量数据,对应到周期快照事实表使用。
    cart_info
  • 2.加购物车这一业务过程是怎样实现的,有哪些限制条件。
    • 一个用户将一个原来不存在的商品加入到购物车,insert操作
    • 一个用户将原来购物车有的数据再加一件到购物车,update操作,并且数据+1
  • 3.数据最终落地那个分区下面,需要明确
    • 首日全量加购记录 首日默认全部加购物车,按照创建时间写入到对应时间分区里面
    • 每日增量加购记录 ,过滤满足条件的数据,直接写入对应的当日时间分区。
  • 4.加购事务事实表的数据流向,如下图:
    在这里插入图片描述
1.首日全量加购的数据加载
  • 针对业务系统中,历史的数据进行处理,就是首日装载的意义。
  • sql的思路:
    • 1.相关表格已同步到ods层,为增量inc表格,购物车信息表和加购操作数据来源类型表
    • 2.两张表格进行关联,获取到加购事务事实表所有字段,
    • 3.处理数据,使用hive动态分区,将不同数据写入到不同分区
  • hive中sql注意:date_format(create_time,‘yyyy-MM-dd’),跟mysql中语法不一致。
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')
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;
2.每日增量加购的数据加载
  • sql思路:

    • 一个用户将一个原来不存在的商品加入到购物车,insert操作
    • 一个用户将原来购物车有的数据再加一件到购物车,update操作,并且数据变大
    • 使用maxwell同步过来的json外部的ts时间作为加入购物车时间,而不使用json内部的create_time作为加购时间,这样设计比较合理。
    • 对加购数量进行判断,
      • 如果是insert类型,直接使用sku_num的值即可,
      • 如果是update操作,需要将maxwell过来的json数据中 新值-老值得到的结果存入.
  • hive中函数的使用:

    • map_keys(map集合):将此map集合中所有的key取出,作为一个数组。
    • array_contains(数组,元素) :该数组中是否包含此元素 ,返回布尔类型的值
    • cast(数据 as int ):将该数据强制转化为int类型
  • hive中时间戳到时间字符串的转换 ,经常用到,官网:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-DateFunctions

    • 时间戳:自零时区以来,1970-01-01以来的经历的秒数(10位)或者毫秒数(13位)
    • 以秒为单位的时间戳,转为时分秒
      • from_unixtime(bigint unixtime[, string format]) 这个转换时间戳函数没有分区概念,所以之间转为了零时区的时间。
      • from_utc_timestamp({any primitive type} ts(必选是毫秒数), string timezone) 使用:from_utc_timestamp(ts*1000, “GMT+8”)
      • 使用时间格式化工具将上面处理完的数据转为想要的格式:date_format(from_utc_timestamp(ts*1000, “GMT+8”),“yyyy-MM-dd HH:mm:ss”)
  • 2020-06-15的增量加购数据处理

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,
    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 source_type_name
    from ods_base_dic_full
    where dt='2020-06-15'
    and parent_code='24'
)dic
on cart.source_type_code=dic.dic_code;
  • linux查看进程对应在服务器的配置
1. 首先jps,查看进程号
2. cd /proc/84912(某进程对应的进程号)
3. limits 文件里面有对应的限制信息
4. exe 是对应的启动二进制进程
5. fd 文件描述符,对应该进程所打开的文件,聚合查看一下打开多少文件即可

2.交易域下单事务事实表

设计流程大概分为4步:选择业务过程 --> 声明粒度 --> 确认维度–> 确认事实

1.下单事务事实表 前期梳理

之前梳理的业务矩阵如下,对应下单过程如下:
在这里插入图片描述

  • 1.选择业务过程:下单 业务过程
  • 2.声明粒度:xx订单是在xx时间,xx用户在xx地区完成下单操作,这对应的是下单事务表每行表示的含义。
  • 3.确认维度:时间、用户、商品、地区、活动、优惠券等,声明维度灵活性较高,是由前面梳理的业务数据库中业务过程决定的,业务过程关联哪些表格也就是对应的环境信息,此处就添加多少维度信息。
  • 4.确认事实:下单件数、下单原始金额、下单最终金额、活动优惠金额、优惠券优惠金额

2.下单事务事实表 DDL表设计分析

  • 之前创建的dim层维度表以外,其他的维度都退化到对应的事实表中,没有退化的,事实表直接在本表中体现某些维度表的id即可,退化的维度直接写入对应数据即可。
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');

3.下单事务事实表 加载数据分析

  • 下单会对哪些业务表格产生影响,如下图:
    在这里插入图片描述
1.首日全量下单的数据加载
  • 业务数据库中 下单明细表中每行数据就能代表一条下单记录,直接将数据同步到ods层然后同步到dwd层即可。
  • 下单事务事实表 跟 下单明细表字段对比,观察哪些字段能获取到,哪些字段获取不到,获取不到的,直接对照数据库表格关联图,书写sql获取对应关系,如下图,没注释掉的就能获取到,注释掉的通过sql关联或者处理字段方式获取。
  • 订单明细表不能获取到的字段,通过关联关系,进行子查询配置
  • 子查询配置完成后,进行sql关联
  • 关联完毕后,通过hive创建动态分区,实现收入不同时间下单数据进入到不同的分区。
  • 最终整合完的sql如下:
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_code,
        dic_name
    from ods_base_dic_full
    where dt='2020-06-14'
    and parent_code='24'
)dic
on od.source_type=dic.dic_code;
2.每日增量量下单的数据加载
  • 2020-06-15 增量下单明细数据加载-最终sql
    • maxwell同步过来的数据,过滤出来insert类型数据即可。
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_code,
        dic_name
    from ods_base_dic_full
    where dt='2020-06-15'
    and parent_code='24'
)dic
on od.source_type=dic.dic_code;

3.交易域取消订单事务事实表

1.取消订单事务事实表 前期梳理

之前梳理的业务矩阵如下,对应下单过程如下:
在这里插入图片描述

  • 1.选择业务过程:取消订单 业务过程
  • 2.声明粒度:xx订单是在xx时间,xx用户在xx地区完成取消订单操作,这对应的是取消订单事务表每行表示的含义。
  • 3.确认维度:时间、用户、商品、地区、活动、优惠券等,声明维度灵活性较高,是由前面梳理的业务数据库中业务过程决定的,业务过程关联哪些表格也就是对应的环境信息,此处就添加多少维度信息。
  • 4.确认事实:取消订单件数、取消订单原始金额、取消订单最终金额、活动优惠金额、优惠券优惠金额

2.取消订单事务事实表 DDL表设计分析

  • 取消订单事务事实表中,一行代表一次用户取消订单操作。
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 ORC
    LOCATION '/warehouse/gmall/dwd/dwd_trade_cancel_detail_inc/'
    TBLPROPERTIES ('orc.compress' = 'snappy');

3.取消订单事务事实表 加载数据分析

  • 数据流程
    • 数据来源相关:订单表 中 取消的订单 关联 取消订单表 中 订单详情,即可获取全量字段
1.首日全量取消订单的数据加载
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table dwd_trade_cancel_detail_inc partition (dt)
select
    od.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
(
    select
        data.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_amount
    from ods_order_detail_inc
    where dt = '2020-06-14'
    and type = 'bootstrap-insert'
) od
join
(
    select
        data.id,
        data.user_id,
        data.province_id,
        data.operate_time canel_time
    from ods_order_info_inc
    where dt = '2020-06-14'
    and type = 'bootstrap-insert'
    and data.order_status='1003'
) 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_code,
        dic_name
    from ods_base_dic_full
    where dt='2020-06-14'
    and parent_code='24'
)dic
on od.source_type=dic.dic_code;
2.每日增量取消订单的数据加载
  • maxwell同步过来的数据,update过来的数据,并且order_status的状态变为了取消状态。
  • 15号取消的订单,可能是之前下单的订单,所以获取订单明细数据的时候,需要关联订单明细表的前几天的数据,需要跟时间维度进行关联,获取当天或者前一天的数据。
insert overwrite table dwd_trade_cancel_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_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
(
    select
        data.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_amount
    from ods_order_detail_inc
    where (dt='2020-06-15' or dt=date_add('2020-06-15',-1))
    and (type = 'insert' or type= 'bootstrap-insert')
) od
join
(
    select
        data.id,
        data.user_id,
        data.province_id,
        data.operate_time canel_time
    from ods_order_info_inc
    where dt = '2020-06-15'
    and type = 'update'
    and data.order_status='1003'
    and array_contains(map_keys(old),'order_status')
) oi
on 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' or dt=date_add('2020-06-15',-1))
    and (type = 'insert' or 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-15' or dt=date_add('2020-06-15',-1))
    and (type = 'insert' or type= 'bootstrap-insert')
) cou
on od.id = cou.order_detail_id
left join
(
    select
        dic_code,
        dic_name
    from ods_base_dic_full
    where dt='2020-06-15'
    and parent_code='24'
)dic
on od.source_type=dic.dic_code;

7.交易域购物车周期快照事实表

1.购物车周期快照事实表 前期梳理

  • 周期快照事实表,实际上类似于Hive中按天做分区,然后全量拉取mysql中数据,这样就会形成mysql的快照,每日全量快照表。

  • 周期快照事实表,解决的主要问题:对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求,而无需再对事务型事实表中大量的历史记录进行聚合了。

  • 周期快照表的创建,完全是基于需求来的,是服务于需求的,此处创建购物车周期快照事实表,是服务于需求:各分类商品购物车存量Top10

    • 将购物车存量数据创建购物车周期快照事实表,直接基于此表,按照sku_id分组求和sku_num,就可简单实现上面的需求。
  • 周期快照表和业务过程对照关系,没有必要进行讨论,可能对应一个业务过程,也可能对应两个业务过程。

2.购物车周期快照事实表 DDL表设计分析

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

3.购物车周期快照事实表 加载数据分析

insert overwrite table dwd_trade_cart_full partition(dt='2020-06-14')
select
    id,
    user_id,
    sku_id,
    sku_name,
    sku_num
from ods_cart_info_full
where dt='2020-06-14'
and is_ordered='0';

4.交易域支付成功事务事实表

1.支付成功事务事实表 前期梳理

2.支付成功事务事实表 DDL表设计分析

3.支付成功事务事实表 加载数据分析

5.交易域退单事务事实表

1.退单事务事实表 前期梳理

2.退单事务事实表 DDL表设计分析

3.退单事务事实表 加载数据分析

6.交易域退款成功事务事实表

1.退款成功事务事实表 前期梳理

2.退款成功事务事实表 DDL表设计分析

3.退款成功事务事实表 加载数据分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370552.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于APRX并行架构的高速QPSK解调实现(Matlab仿真篇)

由于QPSK系统下变频之后的信号中频为720MHz,信息符号速率为500Mbps,因此,采用传统的串行解调方案已无法在FPGA中实现解调。因此,本方案采用基于APRX并行架构实现对高速率的QPSK解调。如图1所示,为并行全数字QPSK接收机实现架构。 图1 并行全数字QPSK接收机实现架构 1 高速…

Golang 接口笔记

基本介绍接口是一个数据类型,可以定义一组方法,但都不需要实现。并且interface中不能包含任何变量。到某个自定义类型要使用的时候,再根据具体情况把这些方法实现出来语法type 接口名 interface {method1(参数列表) 返回值列表method2(参数列…

UG NX二次开发(C#)-CAM-点击插件自动进入CAM模块

文章目录 1、前言2、调用CAM模块错误2、进入加工模块1、前言 UG NX软件中CAM模块作为一个很重要的,也是其特别亮点的功能模块,能实现车、铣、磨、钻等加工工艺编程,但是由于其是通用性比较强,对于专业上的可能不能完全满足要求,这就要求我们在CAM模块下进行二次开发。我们…

操作系统核心知识点整理--进程篇

操作系统核心知识点整理--进程篇什么是系统调用进程篇什么是进程什么是线程从一次fork调用看linux进程和线程的本质区别小结用户级线程和内核级线程的区别进程的状态进程的切换进程调度并发问题死锁参考本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱&…

maya多边形顶点变形批量传递方法

一、问题描述 做项目时,对于重复更改相同模型的顶点位置需要大量重复操作,maya默认提供了多边形属性传递的方法,如下图: 但一次只能执行一次,并且带有大量历史节点,此方式的好处是,可以实现实…

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…

python的所有知识点+代码+注释,不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类,注:不是那个对象!!!!&…

HTML创意动画代码

目录1、动态气泡背景2、创意文字3、旋转立方体1、动态气泡背景 <!DOCTYPE html> <html> <head><title>Bubble Background</title><style>body {margin: 0;padding: 0;height: 100vh;background: #222;display: flex;flex-direction: colum…

SpringCloud————Eureka概述及单机注册中心搭建

Spring Cloud Eureka是Netflix开发的注册发现组件&#xff0c;本身是一个基于REST的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka组件的三个角色 服务中心服务提供者服务消费者 Eureka Server&#xff1a;服务器端。提供服务的注册和发现…

kubernetes 1.26.1 Etcd部署(外接)保姆级教程

目录 部署etcd前期准备 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 安装部署etcd 1.将 kubelet 配置为 etcd 的服务管理器 2.为 kubeadm 创建配置文件 3. 生成…

2023年网络安全某市赛竞赛任务书

竞赛任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 数据库服务渗透测试 100分钟 150 任务二 Windows操作系统渗透测试 200 任务三 Linux操作系统渗透测试 150 任务四 Web安…

【人工智能 AI】什么是人工智能? What is Artificial Intelligence

目录 Introduction to Artificial Intelligence人工智能概论 What is Artificial Intelligence? 什么是人工智能?

ProtoBuf介绍

1 编码和解码编写网络应用程序时&#xff0c;因为数据在网络传输的都是二进制字节码数据&#xff0c;在发送数据时进行编码&#xff0c;在接受数据时进行解码codec&#xff08;编码器&#xff09;的组成部分有2个&#xff1a;decoder&#xff08;解码器&#xff09;和encoder&a…

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测 目录回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测效果一览基本介绍模型搭建程序设计参考资料效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络(…

自动化测试整理 --- STAF/STAX Robot Framework

题记:上周花了点时间学习开源的自动化测试框架Robot Framework,结合自己之前的自动化经验&#xff0c;就想周末写篇文章整理下。 目前&#xff0c;所在项目的自动化测试框架是基于STAF/STAX的拓展&#xff0c;围绕STAX执行引擎&#xff0c;扩展了测试用例的创建、管理&#xf…

验证功能覆盖率收集时per_instance=1可能导致覆盖率线性增长

验证覆盖率收集时&#xff0c;发现coverage database达到了惊人的256G&#xff0c;如下&#xff1a; 进入database中的testdata目录下的用例定位发现&#xff0c;问题出在这个文件&#xff1a; testbench.inst.xml其大小基本等同于验证用例覆盖率的大小。 这个文件时怎么产…

C++函数新思想和标准的输入和输出

欢迎来观看温柔了岁月.c的博客目前设有C学习专栏C语言项目专栏数据结构与算法专栏目前主要更新C学习专栏&#xff0c;C语言项目专栏不定时更新待C专栏完毕&#xff0c;会陆续更新C项目专栏和数据结构与算法专栏一周主要三更&#xff0c;星期三&#xff0c;星期五&#xff0c;星…

【决策树】一文看懂图解决策树原理:信息熵、条件熵与信息增益

本文用过图解的方式并结合实际案例的方式讲述了决策树的基本原理&#xff0c;主要包含信息熵、条件熵与信息增益的概念与计算方式&#xff0c;以及如何选择各个决策节点&#xff08;即&#xff1a;选择信息增益最大的特征&#xff09;。 想要PDF文档的小伙伴&#xff0c;通过关…

[SCOI2005]骑士精神(C++,启发式搜索)

题目描述 输入格式 第一行有一个正整数 TTT&#xff08;T≤10T \le 10T≤10)&#xff0c;表示一共有 TTT 组数据。 接下来有 TTT 个 555 \times 555 的矩阵&#xff0c;0 表示白色骑士&#xff0c;1 表示黑色骑士&#xff0c;* 表示空位。两组数据之间没有空行。 输出格式 …

【Node.js】详细记录express路由和中间件

Node.js路由的概念什么是路由Express中的路由路由的匹配过程路由的使用创建路由模块文件注册路由模块文件为路由模块添加前缀Express中间件Express中间件格式定义中间件函数定义全局生效的中间件函数中间件的作用定义多个全局中间件局部生效的中间件定义多个局部生效的中间件了…