news 2026/4/18 17:51:53

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/10 2:15:31

【开题答辩全过程】以 基于springboot的咖啡店后台管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

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

面试,其实是最容易选错人的方式

传统面试作为选人方式存在哪些致命缺陷?中小企业如何避免招错人的高昂代价?长期以来,面试被视为人才选拔的"黄金标准",但大量数据和实践表明,面试实际上是最容易选错人的方式之一。根据DeepSeek模型的实证研…

作者头像 李华
网站建设 2026/4/14 0:11:27

torch.compile 加速原理:kernel 融合与缓冲区复用

PyTorch 的即时执行模式在原型开发阶段很方便,但在推理性能上存在明显短板。每个张量操作独立启动 kernel、独立访问显存,导致内存带宽成为瓶颈GPU 算力无法充分利用。 torch.compile 通过提前构建计算图来解决这个问题。它的核心策略是操作融合和缓冲区…

作者头像 李华
网站建设 2026/4/16 11:27:59

数字图像处理篇---高通滤波

我用一个最经典的比喻来解释高通滤波。 一句话核心思想 高通滤波 “滤掉平淡,保留惊奇” 它专门放行图像中“变化剧烈”的信号,抑制“变化平缓”的信号。 一、图像中的“频率”是什么? 想象你在听交响乐: 低音(低…

作者头像 李华
网站建设 2026/4/18 10:33:19

Bootstrap4 模态框

Bootstrap4 模态框 引言 Bootstrap 是一个流行的前端框架,用于快速开发响应式、移动设备优先的网页。Bootstrap4 是 Bootstrap 的最新版本,它带来了许多新的特性和改进。模态框(Modal)是 Bootstrap 中的一个组件,它允许你在网页上创建一个弹出窗口,用于显示内容或进行操…

作者头像 李华