news 2026/4/23 11:14:56

30-学习笔记尚硅谷数仓搭建-DWD层交易域购物车周期快照事实表及交易域交易流程累积快照事实表建表语句及分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
30-学习笔记尚硅谷数仓搭建-DWD层交易域购物车周期快照事实表及交易域交易流程累积快照事实表建表语句及分析

目录

1. 交易域购物车周期快照事实表(dwd_trade_cart_full)

业务理解

代码分析

业务价值

2. 交易域交易流程累积快照事实表(dwd_trade_trade_flow_acc)

业务理解

特殊处理逻辑

数据更新策略

业务价值

3. 两种事实表的对比

4. 数据处理特点

购物车表的特点

交易流程表的特点

5. 业务应用场景

购物车快照表的应用

交易流程表的应用

6. 数据质量考虑

购物车表

交易流程表

完整代码

总结


1.交易域购物车周期快照事实表(dwd_trade_cart_full)

业务理解
  • 表类型:周期快照事实表(每日全量快照)

  • 业务场景:记录用户购物车状态的每日快照,用于分析购物车中的商品情况

  • 特点

    • 每天记录所有活跃购物车(未下单)的商品

    • 保留购物车中商品的数量变化历史

    • 只包含未下单的购物车商品(is_ordered='0'

代码分析
-- 只包含未下单的购物车商品 where dt='2022-06-08' and is_ordered='0' -- 关键过滤条件,只保留未下单的商品
业务价值
  • 分析购物车商品的留存率

  • 监控购物车到订单的转化漏斗

  • 识别用户感兴趣但未下单的商品


2.交易域交易流程累积快照事实表(dwd_trade_trade_flow_acc)

业务理解
  • 表类型:累积快照事实表(跟踪业务流程全周期)

  • 业务场景:记录订单从创建到完成的整个生命周期

  • 时间节点:包含三个关键业务事件时间

    1. 下单时间(order_time)

    2. 支付时间(payment_time)

    3. 完成时间(finish_time)

特殊处理逻辑
-- 特殊分区策略:使用9999-12-31表示进行中的订单 nvl(date_format(finish_time,'yyyy-MM-dd'),'9999-12-31')

业务含义

  • dt='9999-12-31':表示订单尚未完成,仍在进行中

  • dt=具体日期:表示订单在该日期已完成

数据更新策略
-- 每日装载逻辑的核心: -- 1. 保留所有未完成的订单(9999-12-31分区) -- 2. 合并当日新增订单 -- 3. 更新已完成订单的状态和时间 select ... from dwd_trade_trade_flow_acc where dt='9999-12-31' union all select ... from ods_order_info_inc where type='insert'
业务价值
  • 流程时长分析:支付时长、配送时长等

  • 转化率分析:下单到支付转化率、支付到完成转化率

  • 订单状态监控:实时掌握订单在各环节的数量


3.两种事实表的对比

维度购物车周期快照表交易流程累积快照表
更新频率每日全量增量更新(事件驱动)
数据粒度购物车级别订单级别
时间维度静态快照(每天一次)动态跟踪(多个时间点)
生命周期从加入购物车到下单从下单到订单完成
主要用途购物车分析、转化分析订单流程分析、时效分析

4.数据处理特点

购物车表的特点
-- 简单映射,无需复杂关联 -- 每日全量覆盖,数据量相对稳定 insert overwrite table ... partition(dt='2022-06-08')
交易流程表的特点
-- 复杂的多表关联(订单、支付、状态日志) -- 累积更新,保留历史状态 -- 使用动态分区(set hive.exec.dynamic.partition.mode=nonstrict)

5.业务应用场景

购物车快照表的应用
  • 商品热度分析:哪些商品经常被加入购物车但未购买

  • 用户行为分析:用户购物车商品数量分布

  • 促销效果评估:促销活动对购物车商品的影响

交易流程表的应用
  • 订单时效分析:平均支付时长、平均配送时长

  • 漏斗转化分析:各环节转化率统计

  • 异常订单监控:长时间未支付、未完成的订单


6.数据质量考虑

购物车表
  • 需确保只包含未下单商品(is_ordered='0'

  • 每日全量,需关注数据量突变

交易流程表
  • 需处理数据延迟到达(如支付信息晚于订单创建)

  • 需处理状态异常(如支付失败后重新支付)

  • 使用nvl()函数处理空值,确保数据完整性


完整代码

-- 四、交易域购物车周期快照事实表 -- 建表语句 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 'SKU_ID', `sku_name` STRING COMMENT '商品名称', `sku_num` BIGINT COMMENT '现存商品件数' ) COMMENT '交易域购物车周期快照事实表' PARTITIONED BY (`dt` STRING) STORED AS ORC LOCATION '/warehouse/gmall/dwd/dwd_trade_cart_full/' TBLPROPERTIES ('orc.compress' = 'snappy'); -- 交易域购物车周期快照事实表数据装载 insert overwrite table dwd_trade_cart_full partition(dt='2022-06-08') select id, user_id, sku_id, sku_name, sku_num from ods_cart_info_full where dt='2022-06-08' and is_ordered='0'; -- 五、交易域交易流程累积快照事实表 -- 建表语句 DROP TABLE IF EXISTS dwd_trade_trade_flow_acc; CREATE EXTERNAL TABLE dwd_trade_trade_flow_acc ( `order_id` STRING COMMENT '订单ID', `user_id` STRING COMMENT '用户ID', `province_id` STRING COMMENT '省份ID', `order_date_id` STRING COMMENT '下单日期ID', `order_time` STRING COMMENT '下单时间', `payment_date_id` STRING COMMENT '支付日期ID', `payment_time` STRING COMMENT '支付时间', `finish_date_id` STRING COMMENT '确认收货日期ID', `finish_time` STRING COMMENT '确认收货时间', `order_original_amount` DECIMAL(16, 2) COMMENT '下单原始价格', `order_activity_amount` DECIMAL(16, 2) COMMENT '下单活动优惠分摊', `order_coupon_amount` DECIMAL(16, 2) COMMENT '下单优惠券优惠分摊', `order_total_amount` DECIMAL(16, 2) COMMENT '下单最终价格分摊', `payment_amount` DECIMAL(16, 2) COMMENT '支付金额' ) COMMENT '交易域交易流程累积快照事实表' PARTITIONED BY (`dt` STRING) STORED AS ORC LOCATION '/warehouse/gmall/dwd/dwd_trade_trade_flow_acc/' TBLPROPERTIES ('orc.compress' = 'snappy'); -- 交易域交易流程累积快照事实表首日数据装载 set hive.exec.dynamic.partition.mode=nonstrict; insert overwrite table dwd_trade_trade_flow_acc partition(dt) select oi.id, user_id, province_id, date_format(create_time,'yyyy-MM-dd'), create_time, date_format(callback_time,'yyyy-MM-dd'), callback_time, date_format(finish_time,'yyyy-MM-dd'), finish_time, original_total_amount, activity_reduce_amount, coupon_reduce_amount, total_amount, nvl(payment_amount,0.0), nvl(date_format(finish_time,'yyyy-MM-dd'),'9999-12-31') from ( select data.id, data.user_id, data.province_id, data.create_time, data.original_total_amount, data.activity_reduce_amount, data.coupon_reduce_amount, data.total_amount from ods_order_info_inc where dt='2022-06-08' and type='bootstrap-insert' )oi left join ( select data.order_id, data.callback_time, data.total_amount payment_amount from ods_payment_info_inc where dt='2022-06-08' and type='bootstrap-insert' and data.payment_status='1602' )pi on oi.id=pi.order_id left join ( select data.order_id, data.create_time finish_time from ods_order_status_log_inc where dt='2022-06-08' and type='bootstrap-insert' and data.order_status='1004' )log on oi.id=log.order_id; -- 交易域交易流程累积快照事实表每日数据装载 set hive.exec.dynamic.partition.mode=nonstrict; insert overwrite table dwd_trade_trade_flow_acc partition(dt) select oi.order_id, user_id, province_id, order_date_id, order_time, nvl(oi.payment_date_id,pi.payment_date_id), nvl(oi.payment_time,pi.payment_time), nvl(oi.finish_date_id,log.finish_date_id), nvl(oi.finish_time,log.finish_time), order_original_amount, order_activity_amount, order_coupon_amount, order_total_amount, nvl(oi.payment_amount,pi.payment_amount), nvl(nvl(oi.finish_time,log.finish_time),'9999-12-31') from ( select order_id, user_id, province_id, order_date_id, order_time, payment_date_id, payment_time, finish_date_id, finish_time, order_original_amount, order_activity_amount, order_coupon_amount, order_total_amount, payment_amount from dwd_trade_trade_flow_acc where dt='9999-12-31' union all select data.id, data.user_id, data.province_id, date_format(data.create_time,'yyyy-MM-dd') order_date_id, data.create_time, null payment_date_id, null payment_time, null finish_date_id, null finish_time, data.original_total_amount, data.activity_reduce_amount, data.coupon_reduce_amount, data.total_amount, null payment_amount from ods_order_info_inc where dt='2022-06-09' and type='insert' )oi left join ( select data.order_id, date_format(data.callback_time,'yyyy-MM-dd') payment_date_id, data.callback_time payment_time, data.total_amount payment_amount from ods_payment_info_inc where dt='2022-06-09' and type='update' and array_contains(map_keys(old),'payment_status') and data.payment_status='1602' )pi on oi.order_id=pi.order_id left join ( select data.order_id, date_format(data.create_time,'yyyy-MM-dd') finish_date_id, data.create_time finish_time from ods_order_status_log_inc where dt='2022-06-09' and type='insert' and data.order_status='1004' )log on oi.order_id=log.order_id;

总结

这两个表体现了数据仓库中两种典型的事实表设计:

  1. 周期快照表:适用于状态相对稳定、需要历史快照的业务场景

  2. 累积快照表:适用于有明确业务流程、需要跟踪状态变化的时间序列场景

通过这两种表的结合,可以全面分析用户从浏览商品(购物车)到完成购买(订单流程)的完整消费旅程,为业务决策提供全面的数据支持。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 17:20:52

退休人员基本医疗保险待遇要求

2023年6月1日实施的《江苏医疗保障条例》取消了连续缴费年限的限定,而且包含了视同缴费年限和实际缴费年限,放宽了累计缴费年限的计算标准。 具体内容: 单位职工依法办理退休手续或者灵活就业人员达到法定退休年龄时,参加职工基…

作者头像 李华
网站建设 2026/3/25 3:55:39

用 PyTorch 实现 CBOW 模型

一、词向量与 CBOW 模型在自然语言处理(NLP)领域,词向量是将离散单词转化为连续数值向量的核心技术,它能让计算机理解单词的语义信息(如语义相似的单词向量距离更近)。而CBOW(Continuous Bag-of…

作者头像 李华
网站建设 2026/4/3 17:57:55

AI产品经理:大模型时代最有“钱“景的岗位,零基础入门到实战全攻略_想转行AI产品经理,90%的人第一步就走错了!

文章指出AI产品经理是未来5年最有前景的岗位,将从业者分为观望者、探索者和跑偏者三类。AI产品经理分为工具型、应用型和专业型三个层次,大多数人应专注于应用型。学习路径包括:夯实产品基本功、掌握AI项目落地能力、补充AI知识技能。起点课堂…

作者头像 李华
网站建设 2026/3/25 16:00:09

大模型动态选择机制解析:从Prompt到代码,彻底搞懂模型路由策略

文章解析大模型动态选择机制,指出选择由应用层代码控制而非Prompt。介绍三种路由模式:规则路由、两阶段智能路由和固定模型选择。强调路由策略发生在LLM推理前,通过策略模式和配置驱动实现。支持多维度路由策略,建议使用外部配置文…

作者头像 李华
网站建设 2026/4/16 4:43:43

Software Development Process Project Management 2

11. "What is the difference between track and trace? Track Definition: Monitoring the progress, status, or history of an entity 实体 (e.g., changes, issues, or user activities) over time. Usage in Software Development: Version Control: Tracking co…

作者头像 李华