考察点
这道题出自阿里数仓实习一面(飞猪数据团队),是两个小问的组合题。前半段"分层的好处"考基本功,几乎人人会背,想出彩要落到具体场景;后半段"哪层最难"没有标准答案,面试官想看的是你的真实体感——实习生答出任何一层都可以,但理由必须来自实践观察而不是猜。追问常往"你在实习里主要做哪层"、"DWS 宽表怎么定字段"、"不分层会怎样"走。
参考答案
分层的四个核心收益
第一是复用,直接对应成本。不分层时每个需求都从原始日志算起,十个报表算十遍"近 7 天活跃用户",计算和存储成本随需求数线性膨胀。分层后 DWD 清洗一次、DWS 汇总一次,下游引用即可。在阿里这种体量下,复用省的是真金白银——一个核心 DWS 表替代几十个下游任务各自的重复计算是很常见的情况。
第二是口径统一。数据团队最大的信任危机是"两个报表对不上"——老板看到两个部门报的 GMV 不一样,整个数据团队的信誉就垮了。分层配合指标字典,把每个指标的加工逻辑收敛到唯一的一张表、一段 SQL 里,下游只能引用不能另算,从机制上杜绝口径分叉。
第三是隔离变化,也就是解耦。上游业务库改表结构、换数据源(比如 MySQL 迁 Hologres),只需要改 ODS 到 DWD 的接入层,DWS、ADS 纹丝不动。反过来业务需求变了要加指标,只动 ADS,不动中间层。不分层的话任何一次上游变更都要翻几十条链路逐个改。
第四是问题定位与血缘清晰。报表数字不对时,分层让排查有了路径:先对 ADS 和 DWS,再对 DWS 和 DWD,最后查 ODS 源头,逐层验证,快速收敛问题位置。不分层的烟囱式链路出了问题只能从头翻日志。
顺带说清楚三层的分工
DWD 明细层:清洗后的原子事实,一行一个业务事件(一次下单、一次支付),粒度最细,不做聚合。DWS 汇总层:按主题和常用维度做轻度汇总,典型是"实体 + 天"粒度的宽表(用户日汇总、商家日汇总),沉淀可复用的公共指标。ADS 应用层:面向具体报表/产品的成品指标,允许按需求定制,生命周期通常最短。
哪层最难:我的答案是 DWS
三层里 DWD 难在繁琐——接几十张业务表、处理各种脏数据、对齐枚举值,是体力活加细心活,但规则明确,错了好发现。ADS 难在琐碎——需求急、变更多,但逻辑通常浅,从 DWS 捞出来拼一拼。
DWS 难在判断力,三个具体的难点。一是粒度定夺:做"用户+天"还是"用户+商品+天"?粒度越细复用性越强但数据量爆炸,粒度越粗越省但下游稍复杂的口径就聚合不出来。这个度没有公式,要靠对下游需求分布的了解——80% 的需求能从这张表出来才算合格。二是字段边界:宽表放哪些字段?高频指标全收会膨胀成几百列的怪物,加字段要回刷历史;收少了下游又得自己回 DWD 算,宽表名存实亡。飞猪这类业务里,用户维的"近 N 天下单/支付/退款/浏览"几十种组合,哪些进 DWS 哪些是 ADS 的活,是要和下游反复磨合的。三是演进维护:业务在变,半年前沉淀的汇总逻辑现在口径过时了,改 DWS 影响面大(几十个下游引用),不改就是技术债,这个治理负担集中在 DWS 层。
一句话总结这三层的难度性质:DWD 难在执行,ADS 难在响应,DWS 难在权衡——权衡是最没法靠勤奋补的,所以我选 DWS。
如果面试官选别的层怎么办
这道题没有标准答案,也有人认为 DWD 最难(埋点和业务库本身脏乱差,清洗规则要从零建立)或者 ADS 最难(直接面对业务方,背对不上的锅)。关键是自洽:你说哪层难,就要能讲出这层特有的、其他层没有的结构性困难,并给出应对方法。最怕的回答是"都挺难的"——等于没答。
可能的追问
- 你实习时做的主要是哪层?照实讲,然后补一个你观察到的该层典型问题和你(或 mentor)的解法,把话题引向你真正摸过的东西。
- 不分层的小团队行不行?行。三五个人、需求量小的阶段,强上五层架构是过度设计,中间隔着一两个人肉沟通就能对齐口径。分层是规模(数据量、团队数、需求并发度)的函数。
- DWS 宽表加字段怎么控成本?只加多个下游确认要用的字段;低频字段让 ADS 自己 join DIM;历史分区是否回刷按字段用途定,不回刷的在字段注释里标清楚生效日期。