订阅更新

数仓分层架构

数仓建模手册 第 1 题 约 5 分钟读完

本文目录
  1. 总结
  2. 一句话记住分层
  3. 每层到底干什么?

总结

记忆点内容
分层核心以空间换时间,每层只干一件事
ODS原始数据,不做处理,回溯用
DWD清洗+标准化+维度关联(最重要的苦力层)
DWS按主题预聚合,减少下游重复计算
ADS直接给应用层使用,以终为始设计

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

基础 | 大数据面试 · 数仓建模系列

面试真题
请介绍一下数仓的分层架构,每一层的职责是什么?你们公司是怎么分层的?

一句话记住分层

数仓分层的核心思想就四个字:以空间换时间。

把数据处理拆成多个阶段,每一层只干一件事,下游复用上游的成果,避免重复计算。这个理念听起来简单,但在实际工作中,我见过太多公司的数仓没有分层,所有逻辑写在一块巨大的SQL里,改一个字段要改十几个地方,口径不一致的问题满天飞。

我喜欢用做饭来类比,一下就能记住:

层级全称职责做饭类比
ODSOperational Data Store原始数据,什么也不动菜市场买回来的生鲜
DWDDetail清洗+标准化+维度关联洗净切好的食材
DWSSummary按主题预聚合做好的半成品菜
ADSApplication Data Store直接给报表/接口用端上桌的成品

每层到底干什么?

ODS层 — 原始快照

ODS层的职责非常纯粹:1:1同步源系统数据,不做任何业务逻辑处理。你可以理解为把源系统的数据「原封不动」地搬过来。保留历史全量或增量,主要用于数据回溯。

为什么需要ODS层?因为它是你的「后悔药」。当下游的DWD、DWS出了问题,你需要回到最原始的数据去排查,ODS就是那个「不管发生什么我都没动过」的备份。我在实际工作中碰到过好几次,上游系统的字段含义悄悄改了,导致DWD层逻辑出错,最终是靠ODS层的原始数据才定位到问题。

命名示例:ods_order_di(di=daily increment,日增量)

DWD层 — 明细清洗

这层是数仓的核心苦力层,干的活最多也最重要。具体来说包括三件事:

字段清洗:NULL处理、类型统一、异常值过滤。比如源系统传过来的年龄字段可能是-1或者999,这些明显不合理的值就需要在DWD层统一处理。我一般的做法是把异常值统一设为NULL,而不是直接删除这条记录——因为其他字段可能是正常的。

维度关联:把user_id关联出用户名、城市等维度信息。这一步做了之后,下游使用时就不需要每次都JOIN维度表了,大大减少了重复JOIN带来的性能开销和出错概率。

数据标准化:时区统一、编码映射、枚举值转换。这是很多人容易忽略的部分,但在实际工作中却是最让人头疼的。不同的源系统可能用不同的编码来表示同一个概念,DWD层就是统一这些差异的地方。

Wood的实战经验
我在短剧出海公司,DWD层最头疼的就是跨时区处理。海外用户遍布多个时区,原始数据是UTC,DWD层要统一转成当地时间。为什么这么重要?因为如果不做时区转换,留存率、日活这些指标全是错的。
比如一个美国用户在当地晚上11点操作,UTC时间已经是第二天了。不转换的话这个用户就会被算到第二天的日活里,留存率也会因此失真。
我们的做法是在DWD层统一加一个local_date字段,根据用户的注册地区转换时区。这样下游所有涉及日期的分析都用local_date,口径就统一了。这个小改动避免了无数次口径争议。

命名示例:dwd_order_detail_di

DWS层 — 主题汇总

DWS层的工作是按业务主题做预聚合,减少下游重复计算。比如你有一张订单明细表,每天有几千万条记录。如果每个报表都要从DWD层开始算,既浪费计算资源,也容易出现口径不一致的问题。

DWS层就是提前把常用的聚合计算做好。典型粒度包括:用户粒度(每个用户每天的行为汇总)、商品粒度(每个商品每天的销售汇总)、天/周粒度(按时间汇总的指标)。

命名示例:dws_user_behavior_1d(1d=天级汇总)

ADS层 — 应用输出

ADS层是数仓的「最后一公里」,直接对接报表、大屏、API接口。通常是宽表或高度聚合的结果表,业务方拿到就能直接用,不需要理解底层表结构和关联关系。

这一层的设计要以终为始——先搞清楚报表需要什么字段、什么粒度,再往回推ADS表该怎么设计。而不是先建一堆ADS表,再看能不能满足报表需求。

命名示例:ads_daily_revenue_report

面试加分提示
不要只背概念,面试官一定会追问「你们公司是怎么分的」。加分回答模板:
「我们ODS层接入了十几个数据源(App埋点、广告平台、第三方支付等),DWD层约30张明细表,每天处理约5000万条数据。DWS层按用户、内容、广告三大主题建设,ADS层直接供报表平台查询。我主要负责广告域的DWD和DWS建设。」
能说出具体数字和你负责的部分,比背书强10倍。
刷题进度保存在当前浏览器