大数据开发工程师面试题及答题要点(含数仓开发高频问题)
大数据开发(也叫大数据工程师、数仓开发)的面试通常 2-4 轮,技术面重点考 SQL 手写、分布式计算原理和数仓建模,项目深挖环节最容易挂——很多人项目说得出来但细节经不起追问。行为面和 HR 面相对轻松,但薪资和稳定性问题答不好也会翻车。
专业基础:SQL 与数据开发
手写一个 SQL:有一张用户行为日志表,字段是用户ID、事件类型、时间,帮我统计每天的新增用户数。
考察点:考察窗口函数和去重逻辑的基本功,这是大数据开发每天都要写的东西。
- 先说思路再写代码:新增用户 = 首次出现日期等于当天的用户,用 min(日期) group by 用户ID 再按日期 count。
- 写完后主动提一句:如果数据量大,可以按日期分区过滤,只扫当天和更早的少量分区。
- 如果面试官追问,补充去重的另一种写法,比如用 row_number() over(partition by 用户ID order by 时间) 取 rn=1。
- 写完自查一遍语法,尤其是子查询别名和 group by 字段,现场写错很减分。
别踩:上来直接写代码不说思路,或者只写了一种写法就停笔,不主动讲性能考虑。
行转列、列转行你会怎么写?举个你实际用过的场景。
考察点:考察 pivot/unpivot 的掌握程度,以及是否真的在业务里用过,而不是背题。
- 先给结论:行转列用条件聚合(case when + sum/max),列转行用 union all 或炸裂函数。
- 举一个真实场景,比如把宽表里的各渠道指标列拆成明细行做对比分析。
- 说明不同引擎下写法差异,比如有的引擎有专门的 pivot 语法,有的只能手写条件聚合。
- 如果记不清具体语法,直接说「具体语法我记不全,但思路是……」,比硬编强。
别踩:只背语法没有场景,一追问「为什么这么设计」就答不上来。
你平时写 SQL 怎么优化?一条跑了很久的慢查询你会怎么排查?
考察点:考察实际调优经验,区分「只会写」和「写得又快又省资源」的人。
- 按顺序讲排查路径:先看执行计划找数据倾斜或全表扫描,再看分区裁剪是否生效。
- 给具体手段:小表 join 大表用广播、倾斜 key 加盐打散、避免 select * 只取需要字段。
- 举一个你亲手优化的例子,带上优化前后的效果对比,比如从小时级降到分钟级。
- 主动提一句资源层面的考虑,比如合理设置并行度、控制 shuffle 量。
别踩:只说「加索引」「建索引」,这在分布式引擎里大多不适用,会暴露经验不足。
专业基础:分布式计算与大数据组件
讲一下 Spark 的 shuffle 过程,为什么它容易成为性能瓶颈?
考察点:考察对计算引擎原理的理解深度,判断是「调包侠」还是懂底层的人。
- 按阶段讲:宽依赖触发 shuffle,数据按 key 重分区、溢写磁盘、网络传输、下游拉取合并。
- 点出瓶颈本质:磁盘 IO + 网络传输 + 序列化开销,数据倾斜时更严重。
- 给应对手段:减少 shuffle 次数(用广播代替 join)、调整分区数、倾斜 key 单独处理。
- 结合自己项目说一次真实调优经历,比纯背原理有说服力得多。
别踩:把 Spark 和 MapReduce 的流程混着讲,或者只会背「shuffle 慢」说不出为什么。
数据倾斜你遇到过吗?是怎么发现、怎么解决的?
考察点:这是大数据开发面试必问题,考察真实生产环境经验,没遇到过的人很难编圆。
- 先讲怎么发现:任务卡在某个 stage 不动、个别 task 处理数据量远超均值。
- 再讲怎么定位:看 key 分布,通常是 null 值、热点用户 ID 或维度表缺失导致的。
- 给两三个解决手段:加盐打散、null 值单独处理、两阶段聚合。
- 强调一句「不同原因用不同解法」,体现你是分析问题而不是套模板。
别踩:只背「加随机前缀」一种答案,被追问「加完之后结果怎么还原」就卡住。
你用过哪些调度工具?一个每天跑的离线任务失败了,你的处理流程是什么?
考察点:考察生产环境的运维意识和责任心,数仓开发日常一半时间在处理任务告警。
- 先讲监控发现:告警通知、看运行日志定位失败环节。
- 再讲分级处理:影响下游的关键链路优先恢复,先重跑验证是否偶发。
- 讲根因排查:是数据源延迟、代码 bug 还是资源不足,分别怎么处理。
- 最后补一句事后动作:复盘、加依赖检查或重试机制,避免同类问题再发。
别踩:只说「重跑一下就好了」,显得没有排查意识和体系化思维。
实时和离线你都做过吗?两边的技术选型有什么区别?
考察点:考察技术视野和是否理解业务场景对架构的驱动,而不只是会用某个工具。
- 先讲场景差异:离线重吞吐和准确性,实时重低延迟和容错,选型由业务需求决定。
- 各举一条典型链路,比如离线的分层批处理、实时的流式计算加状态管理。
- 如果只做过一边,坦诚说明,但补充对另一边的了解和学习路径。
- 可以提一句 lambda 或流批一体的思路,展示架构层面的思考。
别踩:两边都吹「很熟」,被追问实时任务的状态管理、exactly-once 语义就露馅。
数仓建模与架构
介绍一下你们数仓的分层架构,为什么要这么分?
考察点:考察数仓体系化理解,这是数仓开发岗的核心题,几乎必问。
- 按层讲清楚:贴源层、明细层、汇总层、应用层,每层职责一句话说清。
- 重点讲「为什么」:解耦、复用、统一口径、屏蔽底层变更影响。
- 结合自己负责的层展开,说明你具体做了哪些模型和口径沉淀。
- 如果你们分层不规范,可以说「我们实际是简化的 X 层,因为业务规模……」,体现取舍思考。
别踩:只会背「ODS/DWD/DWS/ADS」名词,说不出每层解决什么问题。
维度建模你了解吗?星型和雪花模型怎么选?
考察点:考察建模方法论基础,判断是否有系统学习而不是野路子。
- 先讲核心概念:事实表存度量,维度表存描述属性,围绕业务过程建模。
- 对比两种模型:星型 join 少、查询快;雪花规范但查询链路长,数仓大多用星型。
- 举一个你建过的模型例子,说明怎么选定粒度和维度。
- 可以补充缓慢变化维的处理思路,这是常见的追问点。
别踩:把维度建模和三范式建模混着讲,暴露没系统学过建模理论。
口径不一致的问题你们怎么解决?比如两个报表的 GMF 数字对不上。
考察点:考察数据治理意识和跨团队协作经验,这是数仓开发最真实的日常痛点。
- 先讲排查路径:对齐统计范围、时间口径、过滤条件,逐层 diff 定位差异来源。
- 再讲根治手段:指标口径文档化、汇总层统一加工、下游一律取同一张表。
- 举一个你处理过的真实对数案例,说明最终差异原因是什么。
- 强调「口径对齐是协作问题不只是技术问题」,体现成熟度。
别踩:只从技术角度答,忽略和业务方对齐口径定义这一步,显得经验浅。
项目经历深挖
挑一个你最有代表性的项目讲一下,你负责哪部分,难点是什么?
考察点:考察表达结构和对项目的真实掌握度,这是技术面挂人最多的环节。
- 用「背景—我的职责—技术方案—难点与解法—结果」五段式讲,控制在两分钟内。
- 职责要具体到模块,比如「负责明细层到汇总层的建模和任务开发」,不要说「参与」。
- 难点讲一个技术细节充分的,比如数据倾斜调优或口径治理,能经得起三层追问。
- 结果尽量量化:任务耗时降低多少、支撑了多少业务方、数据规模多大。
别踩:讲成团队成果汇报,全程「我们我们」,面试官分不清哪些是你做的。
这个项目里数据量有多大?每天跑多少任务?如果翻十倍会先出什么问题?
考察点:考察是否真做过这个项目,编造的经历在量化追问下必然露馅。
- 提前把项目的关键数字背熟:表大小、日增数据量、任务数、调度周期。
- 「翻十倍」按瓶颈顺序答:存储成本、小文件问题、任务时长挤压调度窗口、倾斜放大。
- 每个问题给对应解法,比如分区重设计、压缩格式调整、计算资源扩容。
- 答不上来就诚实说「这个量级我们没到过,但我推测……」,展示推理能力。
别踩:数字前后矛盾,或者数据量说得太夸张(比如日增几十亿)却讲不出对应架构。
回头看这个项目,有什么你觉得设计得不好、现在会改的地方?
考察点:考察技术反思能力和成长性,只会夸自己项目的人显得不真实。
- 提前准备一个真实的不足,比如早期没做口径管理导致后期返工。
- 讲清楚当时的约束(排期紧、需求不明),说明为什么当时那么做是合理的。
- 给出现在的改进方案,体现你后来学到了什么。
- 只讲一个即可,讲多了显得项目整体质量差。
别踩:说「没什么不好的,都挺满意」,显得没有反思能力或者没深入参与。
行为面试与 HR 面
为什么从上家公司离职?
考察点:考察稳定性和动机,HR 用这题判断你入职后会不会很快再走。
- 用「向前看」的理由:业务调整、想接触更大规模数据、追求技术成长。
- 理由要和目标岗位能对上,比如「贵司数据规模更大,正是我想深耕的方向」。
- 不抱怨前公司、不提和领导同事的矛盾,一句都不要提。
- 如果是被裁,坦然说业务线收缩即可,现在市场环境下这不是减分项。
别踩:吐槽前公司或前领导,HR 会默认你以后也会这么吐槽他们。
你现在的薪资是多少?期望薪资是多少?
考察点:HR 在做预算匹配和压价空间评估,这题答不好直接损失真金白银。
- 报当前薪资说税前年总包,包含奖金,说个准确数不要含糊。
- 期望薪资给一个区间,下限就是你的心理底价,留 10%-20% 谈判空间。
- 如果对方压价,用「我了解这个岗位的市场区间是……」来支撑,而不是空喊。
- 可以说「薪资可谈,但我更看重平台和成长」,但底价心里必须有数。
别踩:把期望说成「按公司标准来」,等于放弃定价权,最后只能被动接受。
如果业务方半夜找你说数据错了,影响第二天早上的报表,你怎么办?
考察点:考察应急意识和责任心,数仓开发确实会遇到这类情况。
- 先讲第一反应:确认影响范围,快速判断是数据源问题还是加工逻辑问题。
- 再讲优先级:先保早上报表能出,用临时方案兜底,事后彻底修复。
- 补一句事后动作:复盘原因、加数据质量校验、完善告警。
- 语气上体现「不推诿、先解决问题」,这是面试官想听到的态度。
别踩:只讲「我会排查」的流程,不体现先保业务、先兜底的优先级思维。
你有什么想问我们的吗?
考察点:反问环节,考察你对这个岗位的重视程度和判断力,说「没有」基本等于放弃。
- 问技术侧:团队数据规模、技术栈、数仓成熟度,判断是不是你想去的团队。
- 问业务侧:这个岗位主要支撑哪条业务线,需求来源是什么。
- 问成长侧:入职后前三个月的预期产出,团队怎么带新人。
- 不问薪资福利加班(留给 HR 环节),不问官网能查到的信息。
别踩:说「没什么想问的」,或者问「加班多吗、能不能远程」这类过早暴露顾虑的问题。
面试准备清单
| 什么时候 | 要做什么 |
|---|---|
| 面试前 3 天 | 把简历上每个项目按「背景—职责—方案—难点—结果」写成两分钟版本,背熟关键数字(数据量、任务数、优化效果),每个项目准备一个「不足与改进」的答案。 |
| 面试前 3 天 | 每天手写 3-5 道 SQL 题,重点练窗口函数、行转列、连续登录类问题,用纸或纯文本编辑器写,模拟面试没有自动补全的环境。 |
| 面试前 2 天 | 过一遍核心原理题:shuffle 过程、数据倾斜、数仓分层、维度建模、事务与一致性。每题用自己的话讲一遍,能讲给不懂的人听才算过关。 |
| 面试前一天 | 查目标公司的技术栈和业务方向,把简历里的表述往对方的方向靠;准备好「为什么来我们公司」的答案,至少说得出对方两条具体信息。 |
| 面试前一天 | 准备好薪资答案:当前年总包准确数、期望区间(下限即底价)、市场区间依据,写在纸上,避免现场被问懵。 |
| 面试当天 | 提前 10 分钟到场或上线;手写 SQL 环节先说思路再动笔;每答完一个大问题停顿一下,让面试官有追问的空间,不要一个人讲十分钟。 |