别再死记硬背ODS/DWD/DWS了!用电商订单数据流,手把手带你理解数仓五层架构

张开发
2026/4/20 23:29:44 15 分钟阅读

分享文章

别再死记硬背ODS/DWD/DWS了!用电商订单数据流,手把手带你理解数仓五层架构
电商订单数据流用真实案例拆解数仓五层架构第一次接触数据仓库分层概念时那些缩写字母组合——ODS、DWD、DWS、DWT、ADS——就像天书一样令人头疼。教科书式的定义往往让人越看越迷糊直到我在实际项目中跟踪了一条电商订单数据的完整生命周期才真正理解每层架构的价值。本文将通过用户从浏览商品到完成支付的完整场景带你直观感受原始数据如何经过五层加工最终成为决策指标。1. 从点击到支付订单数据全流程沙盘推演假设用户小明在电商平台完成了以下操作上午10:00浏览手机商品页10:05将iPhone 14加入购物车下午14:30完成支付16:00查看物流信息这条看似简单的行为链在数据仓库中会经历怎样的旅程我们先看各层的关键处理逻辑数据层处理重点订单场景对应输出ODS原始数据镜像用户行为日志、订单数据库binlogDWD数据清洗与维度关联带用户属性的完整订单明细DWS轻度聚合的宽表用户当日所有行为事件合并DWT主题域全量汇总用户历史累计订单指标ADS面向应用的指标计算转化率、复购率等报表提示实际项目中各层命名可能不同但核心思想都是原始数据→明细→汇总→应用的加工链路2. ODS层数据海洋的原始捕捞当小明点击商品时客户端SDK会立即发送一条埋点日志到服务器包含{ event_time: 2023-07-20 10:00:23, user_id: u_123456, device_id: d_789012, event_type: page_view, page_id: product_998, os_type: iOS }同时业务数据库会生成订单相关的binlog。ODS层的工作就是原封不动地保存这些原始数据存储策略按天分区存储日志文件如/ods/log/track/20230720数据库快照每日全量备份如ods.order_info_20230720技术选型日志类数据采用ORCSnappy压缩结构化数据使用Parquet列式存储典型问题存在脏数据如user_id为null的测试数据字段格式不统一如时间戳有毫秒/秒两种格式3. DWD层数据炼金术的第一步原始数据需要经过标准化处理才能使用。以订单支付事件为例DWD层会进行以下加工数据清洗-- 剔除测试数据 DELETE FROM dwd_payment_detail WHERE user_id LIKE test%; -- 时间字段标准化 UPDATE dwd_order_info SET pay_time FROM_UNIXTIME(pay_time/1000) WHERE pay_time 9999999999;维度退化-- 将分散的商品维度合并 CREATE TABLE dwd_order_detail AS SELECT o.order_id, o.user_id, g.category1_name, g.category2_name FROM ods_order o JOIN ods_goods g ON o.product_id g.product_id;敏感信息脱敏# 手机号脱敏处理 def mask_phone(phone): return phone[:3] **** phone[-4:]此时我们得到干净的明细数据表包含完整的订单信息和关联维度这是后续所有分析的基石。4. DWS层用户行为的全景视图DWS层将小明当天的所有行为聚合成宽表这是典型处理逻辑CREATE TABLE dws_user_action_1d AS SELECT user_id, SUM(CASE WHEN event_typepage_view THEN 1 ELSE 0 END) AS view_count, SUM(CASE WHEN event_typeadd_cart THEN 1 ELSE 0 END) AS cart_count, COUNT(DISTINCT product_id) AS unique_view_products FROM dwd_event_detail WHERE dt2023-07-20 GROUP BY user_id;关键设计要点宽表字段设计用户维度基础属性、VIP等级行为指标浏览、加购、支付次数商品维度涉及类目、品牌更新策略每日凌晨全量刷新关键指标同时计算7日/30日滚动值5. DWT层历史数据的蓄水池DWT层构建用户主题域的全量宽表包含历史至今的累积指标指标类型计算逻辑示例值首次行为最小事件时间2023-01-15 09:23:11末次行为最大事件时间2023-07-20 14:30:45累积订单SUM(订单金额)8,568.00近30日活跃天数COUNT(DISTINCT 活跃日期)12这类宽表通常采用缓慢变化维SCD策略维护通过每日增量更新保持数据新鲜度。6. ADS层业务决策的指挥台最终生成的报表指标直接驱动运营决策例如用户转化漏斗分析SELECT COUNT(DISTINCT view_user) AS uv_view, COUNT(DISTINCT cart_user) AS uv_cart, COUNT(DISTINCT pay_user) AS uv_pay, ROUND(uv_cart/uv_view,4) AS view_to_cart_rate, ROUND(uv_pay/uv_cart,4) AS cart_to_pay_rate FROM ( SELECT user_id AS view_user, NULL AS cart_user, NULL AS pay_user FROM dws_user_action_1d WHERE view_count0 UNION ALL SELECT NULL, user_id, NULL FROM dws_user_action_1d WHERE cart_count0 UNION ALL SELECT NULL, NULL, user_id FROM dws_order_1d WHERE pay_count0 ) t;商品复购分析# 计算商品复购率 def repurchase_rate(product_id): buyers get_total_buyers(product_id) repeat_buyers get_repeat_buyers(product_id) return round(repeat_buyers / buyers, 4)7. 技术选型与实施建议根据业务规模不同数仓建设有多种实施方案中小型方案存储HDFS Hive计算Spark SQL调度Airflow元数据Atlas大型方案实时层Kafka Flink离线层Hudi/Iceberg服务层Presto/ClickHouse数据湖Delta Lake注意层次划分不是越细越好初创公司完全可以从ODSADS两层开始随着业务复杂度的提升逐步增加中间层实施过程中最常见的三个坑过度聚合在DWD层就做了大量汇总导致无法应对后续需求变化维度爆炸DWS层宽表包含过多非必要维度拖累查询性能链路断裂各层数据依赖关系没有形成闭环出现指标口径不一致在电商大促场景中我们曾用这种分层架构处理过单日上亿订单的数据洪流。当其他团队还在手忙脚乱核对数据时我们已经通过预聚合的DWS层快速输出了实时战报。这种架构弹性在618、双11等关键时刻显得尤为重要。

更多文章