2. 数仓核心概念面试

本章策略:面试官关注你对数仓设计原则(分层、主题域、维度建模、SCD)的深度理解,以及能否结合实际项目说明取舍。建议先掌握概念关系图,再逐题练习。
数仓核心概念 分层架构 主题域 维度建模 缓慢变化维(SCD) ODS→DWD→DWS→ADS 按业务过程/部门划分 星型/雪花型、事实表+维度表 SCD1/2/3 处理历史变化
面试高频结论: 分层解决数据耦合和复用问题;主题域按业务切分;维度建模是数仓设计核心思想;SCD 处理维度属性随时间变化。面试时务必三者联动说明。
---

3 个面试问答卡片

📌 面试问题:请详细介绍数仓分层架构,以及每层的作用和典型表命名规范。

🧐 考察点: 1. 是否理解分层原因(解耦、统一口径、复用) 2. 对ODS/DWD/DWS/ADS的细节掌握 3. 实际项目中如何命名

✅ 回答框架:

  1. 分层目的:一句话点明“空间换时间,降低重复开发”。
  2. 逐层说明:ODS(源数据层,保留原始记录,表名后缀 _ods);DWD(明细层,清洗降维,_dwd);DWS(汇总层,轻度聚合,_dws);ADS(应用层,面向具体报表,_ads)。
  3. 额外层:可提DIM维表层、TMP临时层,体现工程经验。

📝 示例回答(80字): 数仓分层核心为ODS→DWD→DWS→ADS。ODS保持源数据原样;DWD完成清洗、维度退化,表名如`dwd_trade_order_detail`;DWS按主题轻度汇总,如`dws_trade_day_sku`;ADS直接支撑报表,如`ads_trade_city_top10`。减少下游重复加工,提升复用性。

💡 可能追问: 如果业务量极大,ODS层是否也需要分区?为什么DWD层要做维度退化?你们项目每层存储格式怎么选?

⚠️ 避坑提醒: 不要只背分层名字,一定要结合缓存、压缩格式(ORC/Parquet)、分区策略来聊。面试官很反感“纸上谈兵”。

📌 面试问题:如何划分主题域?维度建模中的星型模型和雪花模型分别适用于什么场景?

🧐 考察点: 1. 主题域的划分方法(按业务过程/部门/实体) 2. 对星型/雪花模型的优缺点理解 3. 实际设计中的权衡

✅ 回答框架:

  1. 主题域划分:基于业务流程(如交易、营销、物流等),每个主题域包含一组相近的事实和维度。
  2. 星型模型:维度表直接关联事实表,查询性能高;适合快速报表。
  3. 雪花模型:维度表进一步规范化,减少冗余但增加关联;适合数据仓库ETL复杂、对存储敏感的场景。
  4. 实际选择:互联网行业80%用星型,强调查询性能;金融/ERP用雪花保证一致性。

📝 示例回答(90字): 主题域按业务过程切分,例如交易域包含订单、支付等事实。星型模型维度直接挂事实表,查询快、易理解,适合大促实时看板;雪花模型维度拆成多层,存储更省、一致性强,适合财务对账。我司数仓以星型为主,仅在需要时用雪花规范地址等维度。

💡 可能追问: 事实表分哪几类(事务/周期快照/累积快照)?如何设计退化维度?多值维度怎么处理?

⚠️ 避坑提醒: 不要一味吹捧星型模型,面试官可能追问雪花模型在数据一致性上的优势,提前准备好对比话术。

📌 面试问题:什么是缓慢变化维(SCD)?常用的 SCD 类型有哪些?在项目中如何选择?

🧐 考察点: 1. 对维度属性随时间变化的意识 2. 3种SCD类型的区别 3. 根据业务场景选择合适的类型

✅ 回答框架:

  1. 定义:维度属性非实时变化,需要记录历史状态。
  2. SCD1:直接覆盖,不保留历史,适用于业务不关注历史(如用户姓名)。
  3. SCD2:新增一条记录,加有效时间范围或版本号,保留全部历史,最常用。
  4. SCD3:在原有字段上加“原值/现值”多列,只保留有限历史,适用于关注近两次变化。
  5. 选择原则:业务要求全历史则SCD2;只关心最新则SCD1;需要快速对比前后变化则SCD3。

📝 示例回答(85字): SCD指维度属性(如用户等级)随时间变化。SCD1直接覆盖,如用户手机号;SCD2新增记录加`start_date`/`end_date`,用于会员等级变迁全历史;SCD3加两列(之前等级、当前等级),适合快速对比。我们项目80%用SCD2,配合拉链表实现。

💡 可能追问: SCD2的拉链表如何生成?如何处理历史数据的粒度和闭链?如何避免SCD2数据膨胀?

⚠️ 避坑提醒: 回答SCD时务必提到拉链表的实现细节(如合并更新、过期标记),面试官很看重实战方案,不要只讲理论。
---

项目案例模板

项目名称某电商实时&离线数仓(交易域)
业务背景日均订单500万+,需要按商品、门店、活动等多维度输出小时级/天级GMV、退款率、复购率等报表
规模指标ODS层日增量200TB;DWD表50+张;DWS轻度汇总30+张;日调度任务2000+;支撑10+业务方看板
技术栈Hive+Spark+DataWorks+MaxCompute(阿里云);表存储ORC,分区策略按dt+hh;调度使用阿里云Scheduler
核心难点1. 订单变更频繁(取消、退款),需要拉链表处理SCD2 2. 维度表与事实表关联时遇到“多值维度”(一个订单多个优惠券) 3. 数据倾斜(大商家订单量百万级)
面试高频追问
  • 拉链表怎么压缩历史,避免无限膨胀?→ 按年/季度切片存储,过期闭链后清理
  • 多值维度怎么建模?→ 用桥接表或拆分多行事实(一行一个优惠券)
  • 数据倾斜如何优化?→ 倾斜key加随机盐后聚合,或分桶倾斜MapJoin
可迁移回答话术
  • 分层设计:ODS保留全量原始日志,DWD清洗并关联维表,DWS按商品+天预聚合,ADS对接报表。
  • 维度建模:核心订单事实表采用星型模型,维度有商品、门店、时间、活动;多值优惠券使用桥接表。
  • SCD处理:用户会员等级变化使用拉链表(加start_dt/end_dt/is_active),通过比对历史快照更新。
  • 性能优化:对高频查询的DWS表使用ORC+Zlib压缩,设置合理桶数;使用列裁剪和分区剪枝。
💡 复习建议: 本章核心在于“分层”+“维度建模”+“SCD”三位一体的实战理解。建议准备一个自己做过的小项目,按上述模板整理,面试时能清晰说出每层的表名、字段和SLQ示例。