Hive 与数仓面试专题
概述
大数据面试中,Hive 与数仓占据半壁江山:Hive 原理、调优、倾斜处理是必考,数仓建模与分层设计考察架构思维。本文按"Hive 原理 → SQL 调优 → 数仓建模 → 场景设计"组织高频问答,答案直击要点。
一、Hive 原理高频题
Q1:Hive 执行一条 SQL 的流程?
SQL → Driver → Compiler(AST → 逻辑计划 → 优化 → 物理计划)
→ Executor → 执行引擎(MR/Tez/Spark)→ 结果返回考察点:组件职责、计划生成、引擎执行。
Q2:内部表与外部表的区别?
- 内部表:Hive 管理数据文件,
DROP删表也删数据。 - 外部表:数据在外部路径,
DROP只删元数据保留文件。 - 贴源层用外部表,Hive 产出层用内部表。
Q3:为什么 Hive 比传统数据库慢?
| 原因 | 说明 |
|---|---|
| 无索引 | 靠全表/分区扫描,无 B+ 树 |
| 批处理模型 | 阶段落盘,非管道流式 |
| 调度开销 | 每作业经 YARN 调度启动 |
| 无内存缓存 | 传统引擎有页缓存 |
Q4:分区表和分桶表的区别?
- 分区:目录级粗粒度切分(按日期),利于裁剪。
- 分桶:文件级细粒度切分(按列哈希),利于采样与 Join。
- 组合:日期分区 + 用户分桶。
二、Hive 调优高频题
Q1:数据倾斜怎么解决?
| 场景 | 方案 |
|---|---|
| Group By 倾斜 | 两阶段聚合(加随机前缀打散) |
| Join 倾斜 | MapJoin、随机前缀扩容、过滤热点 |
| 小表大表 | MapJoin 广播小表 |
| 治本 | 上游均衡、分桶设计 |
Q2:Map 数和 Reduce 数怎么调?
- Map 数:由输入分片决定,小文件多则 Map 多,先合并小文件。
- Reduce 数:
bytes.per.reducer自动推断,或手动mapreduce.job.reduces。 - 原则:Reduce 数匹配数据量,避免过多小文件输出。
Q3:如何判断一条 SQL 是否需要优化?
1. EXPLAIN 看是否分区裁剪/谓词下推
2. 看任务数、各任务耗时是否均匀
3. 看输入数据量与小文件数
4. 看是否有倾斜任务Q4:谓词下推为什么有效?
把 WHERE 过滤在读取阶段执行,减少进入计算的数据量。ORC/Parquet 配合列统计可跳过大量数据块。
Q5:小文件问题怎么治?
| 手段 | 说明 |
|---|---|
| 源头 | 写侧控制输出文件数(Reduce 数、合并) |
| 合并 | hive.merge.mapfiles、concatenate |
| 治理 | 定期对小文件目录做合并任务 |
| 表格式 | Hudi/Iceberg 自动小文件合并 |
三、数仓建模高频题
Q1:数仓分层为什么要 ODS/DWD/DWS/ADS?
| 层 | 职责 |
|---|---|
| ODS | 贴源,原样落地 |
| DWD | 明细清洗、维度退化、标准化 |
| DWS | 主题轻度汇总,口径收敛点 |
| ADS | 应用结果表 |
| DIM | 一致性维度 |
分层收益:职责清晰、复用、口径统一、可回溯。
Q2:星型模型 vs 雪花模型?
- 星型:维度不规范化,Join 少、查询快。
- 雪花:维度拆层规范化,省存储但查询慢。
- 生产以星型/星座为主。
Q3:缓慢变化维度的处理方式?
| 类型 | 做法 |
|---|---|
| Type 1 | 覆盖旧值 |
| Type 2 | 拉链表保留全历史(推荐) |
| Type 3 | 保留当前 + 上一版本 |
| Type 6 | 混合方案 |
Q4:事实表的粒度怎么确定?
粒度 = 一行记录代表什么。粒度声明不清,所有指标口径都会乱。确定顺序:业务过程 → 粒度 → 维度 → 度量。
Q5:OLTP 与 OLAP 的区别?
| 维度 | OLTP | OLAP |
|---|---|---|
| 目的 | 交易处理 | 分析决策 |
| 模型 | 3NF | 维度建模 |
| 读写 | 高并发小事务 | 大批量复杂查询 |
| 引擎 | MySQL/PostgreSQL | Hive/Doris/ClickHouse |
四、场景设计题
场景一:日活跃用户(DAU)如何计算?
口径:当日有行为的去重 user_id 数
方案:DWS 层按 (dt, user_id) 明细去重计数
ADS 层输出 DAU 指标
注意:跨端(App/Web)去重口径统一考察点:去重口径、分层位置、性能。
场景二:实时大屏 GMV 与离线报表 GMV 不一致怎么办?
原因:时间口径(下单 vs 支付)、延迟数据、退款处理不一致
方案:统一口径定义 → 实时用同口径 Flink 计算
→ 每日对账,差异超阈值告警 → 修正后重算考察点:批流一致性、对账机制。
场景三:一张 10 亿行的订单表,如何支持"按用户查订单"?
分区:按日期分区裁剪时间范围
分桶:按 user_id 分桶,桶内查
存储:Parquet/ORC + 谓词下推
如果还要秒级点查 → HBase(RowKey=user_id+order_id)考察点:分区/分桶/格式选型、场景边界。
场景四:数仓中一个字段两种口径怎么办?
口径冲突根源:未统一指标管理
方案:指标 ID 统一注册到指标字典
DWS 层唯一计算,下游引用指标 ID 不重算
变更走版本管理考察点:元数据管理、口径治理意识。
五、易错点提醒
| 易错点 | 正确理解 |
|---|---|
| Hive 是数据库 | Hive 是数据仓库工具,不算数,只翻译 SQL |
| 分区越多越好 | 分区过多拖慢元数据,控制粒度 |
| Reduce 越多越快 | 过多 Reduce 产生小文件,拖慢后续 |
| 事务表随意 UPDATE | 海量更新仍用分区覆盖 |
| 交互查询都用 Hive | 即席查询用 Trino/Impala,Hive 跑批 |
六、一句话速记
| 模块 | 一句话 |
|---|---|
| Hive 原理 | Metastore 管元数据,Compiler 生成计划,引擎执行 |
| 调优 | 先裁剪、再 Join、后参数,倾斜用两阶段 |
| 建模 | 星型为主、拉链保历史、粒度先声明 |
| 分层 | ODS 贴源、DWD 明细、DWS 汇总、ADS 应用 |
| 引擎分工 | Hive 跑批、Trino/Impala 交互 |