发布时间:2026/9/6 23:09:37
【架构实战】数据仓库分层:ODS、DWD、DWS、ADS最佳实践 【架构实战】数据仓库分层ODS、DWD、DWS、ADS最佳实践一、同一个订单量四个团队报了四个数2020年初公司月度经营分析会上COO拍着桌子问“昨天到底卖了多少单”运营部说156,832单从后台统计财务部说152,401单从支付系统取的BI团队说158,903单从数据仓库出的市场部说161,200单自建的实时大屏同一家公司同一个指标四个答案。问题出在哪每个团队用的数据源不同、口径不同、时间窗口不同数据仓库没有一个统一的分层架构。这就是数仓分层的价值统一口径、统一出口、统一对外服务。二、数据仓库四层架构2.1 分层全景┌─────────────────────────────────────────────────────────┐ │ 数据仓库分层架构 │ │ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ ADS (Application Data Service) 应用数据层 │ │ │ │ ├── 销售日报表 │ │ │ │ ├── 用户留存报表 │ │ │ │ ├── 实时大屏数据 │ │ │ │ └── 运营推荐数据 │ │ │ └────────────────┬─────────────────────────────────┘ │ │ │ 聚合加工 │ │ ┌────────────────▼─────────────────────────────────┐ │ │ │ DWS (Data Warehouse Summary) 汇总数据层 │ │ │ │ ├── 用户日汇总表1人/天/行 │ │ │ │ ├── 商品日汇总表1品/天/行 │ │ │ │ └── 渠道日汇总表1渠道/天/行 │ │ │ └────────────────┬─────────────────────────────────┘ │ │ │ 轻度汇总 │ │ ┌────────────────▼─────────────────────────────────┐ │ │ │ DWD (Data Warehouse Detail) 明细数据层 │ │ │ │ ├── 订单事实表一笔订单一行 │ │ │ │ ├── 支付事实表 │ │ │ │ ├── 用户维度表 │ │ │ │ └── 商品维度表 │ │ │ └────────────────┬─────────────────────────────────┘ │ │ │ 清洗加工 │ │ ┌────────────────▼─────────────────────────────────┐ │ │ │ ODS (Operational Data Store) 原始数据层 │ │ │ │ ├── 业务数据库同步1:1镜像 │ │ │ │ ├── 日志原文Nginx/App日志 │ │ │ │ └── 外部数据第三方API │ │ │ └──────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────┘2.2 各层职责与原则分层英文全称职责核心原则数据特征ODSOperational Data Store贴源层1:1镜像业务数据不做任何加工原始、乱、全量DWDData Warehouse Detail明细层数据清洗标准化业务过程原子化干净、规范、明细DWSData Warehouse Summary汇总层轻度聚合面向主题轻汇总按天/小时汇总ADSApplication Data Service应用层面向具体产品按需定制即查即用三、DWD层设计——数仓的核心3.1 事实表设计星型模型-- 事实表订单明细DWD层CREATETABLEdwd_order_detail(order_idBIGINTCOMMENT订单ID,user_idBIGINTCOMMENT用户ID,product_idBIGINTCOMMENT商品ID,shop_idBIGINTCOMMENT店铺ID,category_idBIGINTCOMMENT类目ID,-- 度量值事实original_amountDECIMAL(12,2)COMMENT原价,discount_amountDECIMAL(12,2)COMMENT优惠金额,final_amountDECIMAL(12,2)COMMENT实付金额,quantityINTCOMMENT购买数量,-- 时间维度create_timeDATETIMECOMMENT下单时间,pay_timeDATETIMECOMMENT支付时间,dt STRINGCOMMENT分区日期)COMMENT订单明细事实表PARTITIONEDBY(dt STRING);-- 维度表用户维度CREATETABLEdim_user(user_idBIGINTCOMMENT用户ID,user_name STRINGCOMMENT用户名,register_dateDATECOMMENT注册日期,city STRINGCOMMENT城市,channel STRINGCOMMENT注册渠道,user_level STRINGCOMMENT会员等级)COMMENT用户维度表;-- 查询时用星型模型关联SELECTu.city,SUM(o.final_amount)AStotal_gmv,COUNT(DISTINCTo.user_id)ASuvFROMdwd_order_detail oJOINdim_user uONo.user_idu.user_idWHEREo.dt2025-06-01GROUPBYu.city;3.2 数据清洗六步法DWD层数据清洗标准流程 1. 去重按主键去重保留最新一条 INSERT INTO dwd_order_detail SELECT ... FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY update_time DESC) rn FROM ods_order ) t WHERE rn 1; 2. 空值处理NULL → 未知 或 0 COALESCE(user_name, 未知) AS user_name 3. 格式统一手机号去86日期统一yyyy-MM-dd REGEXP_REPLACE(phone, ^\\86, ) AS phone 4. 非法值过滤负数金额、未来时间 WHERE amount 0 AND create_time CURRENT_TIMESTAMP 5. 字段脱敏手机号中间四位替换 CONCAT(SUBSTR(phone,1,3), ****, SUBSTR(phone,8,4)) AS phone_masked 6. 数据打标标记数据来源 mysql_orders AS source_system四、DWS层设计——汇总的艺术4.1 汇总粒度选择-- 错误做法汇总力度太细没效果CREATETABLEdws_user_hourly(user_idBIGINT,hourSTRING,order_cntBIGINT);-- 数据量几乎等于DWD层没有意义-- 正确做法选择合理粒度CREATETABLEdws_user_daily(user_idBIGINTCOMMENT用户ID,stat_dateDATECOMMENT统计日期,order_cntBIGINTCOMMENT下单数,pay_cntBIGINTCOMMENT支付数,pay_amountDECIMAL(18,2)COMMENT支付金额,refund_cntBIGINTCOMMENT退款数,refund_amountDECIMAL(18,2)COMMENT退款金额,first_order_timeDATETIMECOMMENT首次下单时间,last_order_timeDATETIMECOMMENT末次下单时间)COMMENT用户日汇总表PARTITIONEDBY(dt STRING);4.2 DWS聚合SQL模板-- 每日调度任务INSERTOVERWRITETABLEdws_user_dailyPARTITION(dt${bizdate})SELECTuser_id,${bizdate}ASstat_date,COUNT(DISTINCTorder_id)ASorder_cnt,COUNT(DISTINCTCASEWHENpay_timeISNOTNULLTHENorder_idEND)ASpay_cnt,SUM(CASEWHENpay_timeISNOTNULLTHENfinal_amountELSE0END)ASpay_amount,COUNT(DISTINCTCASEWHENrefund_status1THENorder_idEND)ASrefund_cnt,SUM(CASEWHENrefund_status1THENrefund_amountELSE0END)ASrefund_amount,MIN(create_time)ASfirst_order_time,MAX(create_time)ASlast_order_timeFROMdwd_order_detailWHEREdt${bizdate}GROUPBYuser_id;五、ADS层设计——面向应用5.1 销售日报表CREATETABLEads_sales_dailyASSELECTstat_date,category_name,-- 本日指标SUM(order_cnt)ASorder_cnt,SUM(order_amt)ASorder_amt,SUM(pay_amt)ASpay_amt,-- 同比YoYLAG(SUM(order_amt),365)OVER(PARTITIONBYcategory_nameORDERBYstat_date)ASlast_year_amt,-- 环比MoMLAG(SUM(order_amt),1)OVER(PARTITIONBYcategory_nameORDERBYstat_date)ASlast_day_amt,-- 计算增长率ROUND((SUM(order_amt)-LAG(SUM(order_amt),365)OVER(...))/LAG(SUM(order_amt),365)OVER(...)*100,2)ASyoy_rateFROMdws_category_dailyWHEREstat_dateDATE_SUB(CURRENT_DATE,365)GROUPBYstat_date,category_name;六、数据质量保障6.1 质量监控SQL-- 1. 数据量监控SELECTdt,COUNT(*)ASrow_cntFROMdwd_order_detailWHEREdtDATE_SUB(CURRENT_DATE,7)GROUPBYdtORDERBYdt;-- 告警规则今天数据量比昨天少50%-- 2. 空值监控SELECTSUM(CASEWHENuser_idISNULLTHEN1ELSE0END)/COUNT(*)ASnull_rateFROMdwd_order_detailWHEREdtCURRENT_DATE;-- 告警规则空值率超过5%-- 3. 环比监控SELECTtoday_cnt,yesterday_cnt,(today_cnt-yesterday_cnt)/yesterday_cntASchange_rateFROM(SELECTSUM(CASEWHENdtCURRENT_DATETHEN1ELSE0END)AStoday_cnt,SUM(CASEWHENdtDATE_SUB(CURRENT_DATE,1)THEN1ELSE0END)ASyesterday_cntFROMdwd_order_detailWHEREdtDATE_SUB(CURRENT_DATE,1))t;-- 告警规则环比变化超过30%七、任务调度架构调度流程Airflow/DolphinScheduler: 00:00 ─→ ODS层同步开始 01:00 ─→ ODS同步完成 01:10 ─→ DWD层清洗开始 02:30 ─→ DWD层清洗完成 02:40 ─→ DWS层汇总开始 03:30 ─→ DWS层汇总完成 03:40 ─→ ADS层计算开始 04:30 ─→ ADS层计算完成 05:00 ─→ 数据质量检查 06:00 ─→ 报表就绪对外提供八、总结数仓分层的本质是对数据加工过程的规范化管理。分层不是目的统一口径、方便使用才是。核心实践ODS贴源不做加工——保留原始数据为回溯提供基础DWD做细做全——事实表维度表的星型模型是数仓骨架DWS按天汇总——平衡查询性能和灵活性ADS面向产品定制——即查即用降低使用门槛数据质量是生命线——量级监控 空值监控 环比监控 三道防线任务要有依赖链——上游失败自动阻断下游防止脏数据扩散一个教训不要一开始就建全部分层。先上ODSDWD业务跑通了再加DWSADS。分层越早越全的团队70%的ADS表最终都没人用。个人观点仅供参考

相关新闻

2026/9/5 4:14:57

比较长的字符串中,是否含有特定字符串_repeat

比较长的字符串中&#xff0c;是否含有特定字符串_repeat#include <string.h>const char *long_str "This is a very long string containing some keywords"; const char *needle "keywords";if (strstr(long_str, needle) ! NULL) {// 存在 &qu…

2026/9/7 0:03:37

2026 AI视觉与物联网开发板选购指南:从MCU到Jetson的档位解析

2026 年已经过了一大半&#xff0c;如果你现在正准备入手 AI 视觉或物联网开发板&#xff0c;我建议你先别急着下单。市面上从几十块的 ESP32 到几千块的英伟达 Jetson&#xff0c;价格差了近百倍&#xff0c;宣传话术却几乎一样&#xff0c;都告诉你“能跑 AI、能做视觉、能搞…

2026/9/7 0:03:37

基于Vue的企业门户网站管理系统的设计与实现

目 录 摘 要 Abstract 目 录 1 引言 1.1 选题背景 1.2 研究现状 1.3 目的和意义 1.4 论文结构安排 1.5本章小结 2 开发环境与技术 2.1 MySQL数据库 2.2 Java语言技术 2.3 Spring Boot框架 2.4 Vue.js 2.5 本章小节 3 系统分析 …

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介&#xff1a;BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本&#xff0c;由BSI标准出版&#xff0c;重点规定游乐设施和游乐设备在设计与制造环节的安全准则&#xff0c;与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介&#xff1a;UL 1642是锂电池安全领域的重要规范&#xff0c;本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读&#xff0c;用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件&#xff0c;压缩包大小834KB&#xff0c;便…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目&#xff1a;基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念&#xff0c;但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测&#xff0c;PyQt5 负责提供可视化的桌面交互界…

2026/9/6 23:58:36

S698-T处理器上RTEMS移植与开发实战

简介&#xff1a;文档围绕S698-T处理器上的RTEMS实时操作系统移植与应用程序开发展开&#xff0c;定位为航天嵌入式领域的专业技术文献&#xff0c;适合嵌入式实时系统开发者、航天器电子系统工程师及相关专业研究生阅读参考。文档以构建星载计算机模型为背景&#xff0c;论证了…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊&#xff01;#雷神 #复联”这类调侃式短标题&#xff0c;第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里&#xff0c;但细想一下就能发现&#xff0c;它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊&#xff0c;可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”&#xff0c;你会发现&#xff0c;这场比较本质上是两个不同 IP 策略的长期结果对比&#xff1a;超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介&#xff1a;本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案&#xff0c;聚焦调制信号自动检测与识别这一典型无线通信任务&#xff0c;解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件&#xff08;10.73MB&#xff09;&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目&#xff1a;基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念&#xff0c;但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测&#xff0c;PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介&#xff1a;UL 1642是锂电池安全领域的重要规范&#xff0c;本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读&#xff0c;用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件&#xff0c;压缩包大小834KB&#xff0c;便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介&#xff1a;BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本&#xff0c;由BSI标准出版&#xff0c;重点规定游乐设施和游乐设备在设计与制造环节的安全准则&#xff0c;与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…