1. 数仓分层的经典四层(ODS/DWD/DWS/ADS)各自职责、数据粒度与命名规范是什么?为什么数仓必须分层而不能直接使用业务库表?
请说明经典四层架构 ODS、DWD、DWS、ADS 各自承担什么职责、数据粒度如何设计、命名规范是什么,并解释为什么数仓必须分层而不能直接使用业务库表?
- 四层架构的职责边界与数据粒度定义
- 各层命名规范与分层必要性
- 分层对数据治理与复用性的价值
经典四层分为:ODS(操作数据存储层)直接贴源保留业务库的原始数据,粒度与源库一致,命名通常为 ods_业务过程+表名,只做轻度清洗与去重;DWD(明细数据层)做维度建模,把 ODS 明细按事实表规范化,粒度是业务过程的最小粒度,命名如 dwd_主题域_业务过程_事实表,常做清洗、脱敏、维度退化、空值处理;DWS(汇总数据层)按主题域做轻度的汇总宽表,粒度是"维度+统计粒度"的汇总,命名如 dws_主题域_对象_汇总粒度,承载公共指标与常见维度组合;ADS(应用数据层)面向具体应用或报表定制,粒度贴合业务需求,命名如 ads_业务线_指标_场景。数仓必须分层而不可直接用业务库表,原因在于:业务库面向在线事务、频繁更新且结构不稳定,直接查询会加重业务库压力并受制于其表结构;分层通过"贴源—加工—汇总—应用"的解耦,让每层职责单一、可复用,统一口径、统一加工逻辑,便于权限管控、数据追踪与回溯,也提升了数据质量和开发的协作效率。
分层的本质是"以空间换时间"——多存几份数据换取查询效率、复用性和口径一致性。ODS 保真保证可追溯,DWD 规范化保证分析口径统一,DWS 预聚合保证查询性能,ADS 面向应用保证交付灵活。若只用业务库表,则无法做到口径统一、历史回溯和性能优化,这正是数仓存在的根本原因。
-- 各层命名示例(建表命名规范)
CREATE TABLE ods_trade_order_di ( -- ODS:贴源明细,日增量
order_id BIGINT,
user_id BIGINT,
amount DECIMAL(10,2),
create_time TIMESTAMP
);
CREATE TABLE dwd_trade_order_detail_di ( -- DWD:明细事实表
order_id BIGINT, user_id BIGINT,
amount DECIMAL(10,2), province_id BIGINT,
create_time TIMESTAMP
);
CREATE TABLE dws_trade_user_daily_1d ( -- DWS:用户日汇总
user_id BIGINT, dt DATE,
order_cnt BIGINT, order_amount DECIMAL(14,2)
);
CREATE TABLE ads_trade_dashboard_di ( -- ADS:报表应用
dt DATE, province_id BIGINT, gmv DECIMAL(14,2)
);