[toc]
大数据面试高频 SQL 必背真题(开窗 + 行列转换 + 倾斜优化 + 经典场景)
全是面试常考,直接背语法和套路,现场就能写。
一、开窗函数 三大必考
1. row_number /rank/dense_rank 区别
- row_number():连续不重复 1,2,3,4
- rank():跳跃排名 1,1,3,4
- dense_rank():连续排名 1,1,2,3
2. 分组取 Top1(每组最新一条)
场景:每个用户取最近一条行为记录
1 | SELECT * FROM ( |
3. 累计求和(逐月累计)
1 | SELECT |
4. 移动平均(近 3 日均值)
1 | AVG(price) OVER(ORDER BY dt ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) |
二、行列转换 面试必写
1. 行转列(多行变一行,逗号拼接)
Hive/Spark SQL
1 | SELECT |
2. 列转行(一行拆多行)
1 | SELECT |
三、数据倾斜 SQL 写法(面试高频)
1. 空值 / 大量 NULL 倾斜 优化
1 | -- 原写法倾斜 |
2. Key 热点倾斜 加盐两阶段聚合
1 | -- 第一层:局部聚合加盐 |
3. Join 倾斜优化
- 小表广播 Join:
/*+ BROADCAST(small_table) */ - 大表倾斜 Key 单独处理,其余正常 Join,再 Union
1 | SELECT /*+ BROADCAST(b) */ a.* |
四、经典业务 SQL 真题
1. 连续登录天数(超高频)
思路:日期减去行号,相同即为连续
1 | SELECT user_id, MIN(dt), MAX(dt), COUNT(1) AS continue_days |
2. 留存率计算(次日留存)
1 | SELECT |
五、大数据 SQL 通用优化口诀(面试背)
- 尽早过滤:先 where 后 join,减少 shuffle
- 分组前过滤,聚合少数据
- 小表广播 Join,避免 shuffle 倾斜
- 避免 select *,只查需要字段
- 分区过滤必加,禁止全表扫描
- 倾斜 Key:加盐打散、局部 + 全局聚合
- 用好开窗代替子查询,简洁高效