数仓建模中维度建模与分层划分是核心设计思路,分层以空间换时间为核心逻辑,同时需掌握分层设计、模型建设、开发流程及分层效果评价的关键要点,以下为面试核心笔记整理:
🎯一、数仓分层的核心目的
数仓分层是维度建模的重要配套设计,核心是通过分层拆解复杂度、提升复用性,具体目的包括:
-
🧩使数据更清晰,简化复杂问题。将复杂需求简单化拆解成多个步骤解决,每层去完成各自对数据的处理。
-
🔄减少重复开发,提升开发效率。通过大量的预处理,建设数仓中间层,提高数据复用性。
-
🔍数据血缘追踪,便于定位问题。分层能够清晰表和任务的上下游,知道下游哪个模块在使用,便于排查问题和后期维护。
🏗️二、数仓分层架构体系
数仓分层可概括为 5 层,采用ODS、DWD、DWM、DWS、ADS(大小宽表)的架构体系,各层核心定义如下:
-
ODS 层📥:接入层,从数据源 (api、数据库等) 将数据同步到数仓中,中间不做任何处理操作。
-
DWD 层🧹:明细层,对 ODS 层的数据进行清洗、关联、转换、维度退化、建设主题域等操作。
-
DWM 层📊:轻度汇总层,是 DWD 和 DWS 层的过渡层次,对 DWD 层的生产数据进行轻度汇总和汇总统计,把复杂计算追到相关指标前置处理,提升公共指标的复用性,减少重复加工。
-
DWS 层📈:汇总层,按主题域、颗粒度 (如买卖家) 划分,按照周期粒度、维度聚合,形成字段较多的宽表,用于提供后续的业务查询和应用。更重要的是要在 DWS 层完成指标口径统一和沉淀。
-
ADS 层💻:应用层,按照应用域、颗粒度 (如买卖家) 划分,按照应用主题将对应的数据标签补充至应用层,形成用户画像或专项应用。
📋三、各分层设计细则与命名规范
(一)ODS 层:数据接入层📥
-
架构拆解:可拆解为ori 板块和ods 板块
-
ori 板块:主要做 Json 消息存储。
-
ods 板块:存放解析 Json 成字段后的数据;若从 MySQL 等数据库抽取数据,字段需与数据源保持一致,数据类型遵循整型使用 bigint,日期文本使用 string,小数用 double/decimal。
-
-
表命名规范:
ods_库名_表名_df或者ods_topic_df
(二)DWD 层:数据明细层🧹
-
核心操作:做清洗、关联、转换操作
-
清洗:处理 test、异常数据。
-
转换:比如将 code 值转换为 name。
-
关联:按相同数据域进行关联组合。
-
-
模型设计:采用模型 5 要素(数据域、维度、颗粒度、度量、事实),维度可不在 DWD 层做维度退化,原因有两点:
-
🔁同数据域的维度有重复,需要额外存储维度数据。
-
⏳DWD 层刷新维度代价高。
-
-
颗粒度:细分到不可划分,比如买家 id、卖家 id。
-
数据刷新与分区:全量 / 增量(df/di)需根据数据量级选择;分区按照业务进行二级分区划分,同时参考数据本身形态(如日志数据每天不同的情况)。
-
数据域划分:
-
原则:按照业务流程拆解;若无业务流程则按产品分类、业务类型划分。
-
案例(金融业务):按贷前、贷中、贷后的业务流程划分,具体为贷前 (申请、开通、合同),贷中 (支用、借据还款、还款计划、分期订单),贷后 (催收、核销)。
-
-
表命名规范:
dwd_一级数据域_二级数据域_xx_detail_df/di -
冗余设计:DWD 层冗余是因为做维度退化(也可在 DWM 层做维度退化,目的相同),主要为高频查询字段、常用计算结果、分区键做冗余,作用是提高查询性能、减少查询关联,同时需避免数据一致性问题和存储成本。常见冗余字段示例:订单明细表中冗余用户信息、商品信息,订单金额等计算结果。
(三)DWM 层:明细宽表层(轻度汇总层)📊
-
核心操作:通过业务流程起始 id 关联其他表,之后进行维度退化(将事实表 left join 维表,把右表维度字段带到 dwm 中)。
-
维度退化的价值:维度可在 DWM 层统一维护,方便维度刷新维护;同时 DWM 层全流程宽表更便于业务理解,后续 DWS 和 ADS 层均可复用 DWM 表,且数据域保持一致。
-
表命名规范:
dwm_一级域_xx_detail_df/di
(四)DWS 层:数据汇总层📈
-
核心工作:
-
📏统一指标口径,先确定指标,再按周期 (30/60/90 天) 和颗粒度完成指标聚合。
-
📊聚合方法:按周期加颗粒度汇总,比如交易域最近 30 天用户指标,通过
where datadiff(t-1,createtime)<= 30 group by user id做派生指标。 -
�下游应用:ads 层加工时,以维度表为主表关联 DWS 表,仅需汇总一次,最终做成标签宽表,下游分析可在取数平台 / 可视化平台拉拽维度和标签,也可用于人群圈选。
-
-
聚合策略:
-
核心作用:
(1) ✅保障指标口径统一,为 ADS 层提供复用。
(2) 🧩对 DWD 层明细按不同颗粒度划分,划分标准参考下游数据分析的颗粒度需求。
(3) 📅按指标周期完成周期划分,保障每个数据模型指标周期统一。
(4) 🧮按上述内容进行聚合计算(DWS 层基本只放置派生指标)。
-
表命名规范:
dws_一级域_二级域_聚合颗粒度_xx_target_30d
(五)ADS 层:数据应用层💻
ADS 层分为大宽表和小宽表两类,核心是按应用域 / 颗粒度补充数据标签,支撑业务应用与专题分析。
-
大宽表📑
-
设计逻辑:根据业务划分主题域 (如不同金融产品场景),围绕业务分析视角设计;可做成不同颗粒度的标签表、用户 / 买卖家标签表,或主题域与数据域一致的标签表。
-
设计案例:卖家画像模型,以卖家维表为主表
left join dws_xx表 left join dws_业务表制作标签;确定维表主表关联 dwd、dws 业务表的颗粒度,最终通过group by单个颗粒度字段,为多个专项提供服务。 -
价值:通用性强,可被小宽表复用做定制开发。
-
-
小宽表📄
-
适用场景:单独做某个专题分析时使用,比如员工离职动因分析、leader 分析等。
-
开发逻辑:复用大宽表的标签,基于大宽表做定制开发。
-
-
表命名规范:
ads_一级数据域_二级数据域_颗粒度_xx_d
🔑四、数据模型建设五要素
模型建设五要素是数仓建模的核心准则,具体包括:
-
主题域🌐:划分场景。
-
颗粒度🔍:颗粒度细分到不可再拆分。
-
维度📐:包括基础维度和分析维度。
-
度量📏:也就是指标。
-
事实表📈:根据业务场景划分数据域,通过引用维度和业务相关的度量值设计事实表,同时保证数据域下各场景的颗粒度为不可拆分。
🗺️五、数仓开发相关流程
(一)数据模型开发流程
-
🕵️数据调研:包括业务调研和需求分析,目的是了解业务过程和收集下游需求。
-
🗺️划分数据域:数据域是面向分析,对业务过程或维度进行抽象的集合。
-
📊构建总线矩阵,明确统计指标:总线矩阵以一致性维度为列,以业务过程为行,构建业务的数据矩阵,通过标记表示该维度与业务过程的相关性。
-
📜规范定义:制定数仓建模与开发的相关规范。
-
🚀模型分层开发,部署任务:cdm 层设计事实表目的是支持业务过程,保证需求中的度量和维度可获取;多业务过程需分析选择事实表类型;开发指标时,需考虑表支撑的业务过程指标及派生指标的产出。
(二)数据需求开发流程
-
📨需求提出:业务方提出需求,由产品评估需求并完成需求收口。
-
📊需求价值评估:评估需求优先级,同时评估需求背景 / 口径 / 数据表及关联关系,沟通需求带来的量化收益。
-
🛠️需求开发:包括构建总线矩阵 / 数据模型设计,数据模型评审,遵循规范开发。
-
✅需求质量校验:包括代码 / 依赖检验,DOC 配置和 SLA,上线报告及任务初始化,线上数据验证和业务方验证。
-
📤需求交付:交付业务,并定期询问 / 沟通数据模型带来的业务价值。
🚀六、从 0 到 1 构建数仓的步骤
-
🏢明确组织架构、业务过程。
-
🎨根据业务场景,制定架构方向,确定技术栈选型,评估是否购买平台配置资源。
-
🧩梳理当前业务,明确数据源,划分数据域。
-
🎯确定数仓一期建设的大方向,制定数仓版图 okr。
-
📜规范定义:包括业务及主题域命名规范、数仓分层规范、元数据规范、模型建设规范、流程制定规范。
-
📏确定核心指标口径:接入核心数据表,完成 ods、dwd、dws 模型建设。
-
💻根据业务场景建设 ads 层,支撑下游一期看板和专题报告。
✅七、数仓分层好坏的评价维度
结合数仓分层的核心目的与业务落地效果,从以下维度评价分层设计优劣:
-
数据清晰性🧹:各层职责是否明确,数据流转是否可追溯,数据域与主题域划分是否贴合业务逻辑,能否通过分层简化复杂业务问题。
-
开发复用性🔄:是否减少重复开发,中间层(DWD/DWM/DWS)是否实现公共指标、基础数据的复用,降低下游开发工作量。
-
可维护性🛠️:数据血缘是否清晰,问题定位是否高效;维度、指标的维护成本是否可控;表命名、分区等规范是否统一,便于团队协作维护。
-
查询性能⚡:是否通过分层预处理(如 DWS 层聚合、DWD 层冗余)提升下游查询效率,是否实现 “以空间换时间” 的核心目标。
-
指标一致性📏:是否在 DWS 层完成指标口径的统一沉淀,下游 ADS 层及业务应用是否基于统一指标口径开发,避免数据口径分歧。
-
业务适配性💼:分层设计是否贴合业务场景,ADS 层能否有效支撑业务看板、专题分析、用户画像等下游需求。
-
扩展性📈:分层架构是否支持业务迭代,新增业务场景时能否在现有分层体系下快速扩展,数据域与模型的扩展成本是否可控。