中级数据工程师面试题
中级数据工程师面试的考察重点、常见题目,以及如何用即时 AI 反馈练习。
中级阶段的考察重点
考察建模、编排,以及独立负责一条流水线。
数据工程师常见面试题示例
- 编程写一条 SQL 查询,找出每个部门薪资第二高的人。好回答应覆盖
- ROW_NUMBER窗口函数
- 子查询或CTE
- 处理并列薪资的DENSE_RANK
- 按部门分区排序
查看范例答案
首先,使用ROW_NUMBER()窗口函数按部门分区、按薪资降序排序,为每个部门内的员工分配行号。然后在外层查询中筛选出行号为2的记录,即可得到薪资第二高的人。如果存在并列薪资且要求所有并列者都列为第二,则应改用DENSE_RANK()并筛选排名为2。注意,如果部门只有一人,则不会有结果。此方法比子查询更高效、可读性更强。
参考代码sql SELECT department_id, employee_id, salary FROM ( SELECT department_id, employee_id, salary, ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rn FROM employees ) ranked WHERE rn = 2; - 技术面解释 ETL 和 ELT 的区别,以及各自适合什么场景。好回答应覆盖
- 转换与加载顺序
- 计算与存储成本
- 数据量大小和预处理需求
- 适合OLAP vs 原始数据留存
- 典型工具对比
查看范例答案
ETL(Extract, Transform, Load)先进行数据转换再加载到目标系统,适合数据仓库结构固定、需要清洗和聚合后再存储的场景,能节省目标系统存储和计算资源,但弹性较差。ELT(Extract, Load, Transform)先加载原始数据到目标系统(如数据湖),再在目标系统内转换,适合大数据量、数据Schema灵活或需要保留原始数据分析的场景,利用了MPP或云计算的弹性计算能力,但可能增加存储成本。例如,传统数据仓库多用ETL,而基于Spark或Snowflake的现代架构常用ELT。
- 技术面你会如何设计一个可以安全重跑的幂等流水线?好回答应覆盖
- 唯一标识与去重机制
- 检查点与状态持久化
- 输出可重复且无副作用
- 幂等写入策略
- 回滚与重试设计
查看范例答案
设计幂等流水线需保证同一份数据多次重跑结果相同。核心思路:1)为每条记录生成全局唯一ID,目标表基于该ID做去重插入(INSERT ON DUPLICATE UPDATE或MERGE INTO)。2)使用检查点(checkpoint)记录已处理位置,重跑时从上次失败点恢复,避免重复处理。3)输出操作设计为幂等,例如覆盖写而非追加,或使用版本号控制。4)避免副作用,如发送邮件等操作应有去重机制。5)将计算与状态分离,利用外部存储保存偏移量或哈希值。
- 技术面在流式流水线中,你如何处理迟到的数据?好回答应覆盖
- 事件时间与处理时间
- 水印(Watermark)
- 允许延迟窗口与触发策略
- 侧输出(Side output)
- 更新修正结果
查看范例答案
流式处理中迟到数据指事件时间早于水印但晚到。常见处理方式:1)设置水印(watermark)来界定可容忍的延迟时间,例如允许5分钟延迟,超过此阈值的数据丢弃或发送到侧输出。2)使用允许延迟的窗口(allowed lateness),在窗口关闭后仍能处理迟到数据并触发重新计算,更新聚合结果。3)对于关键数据,可将迟到数据单独存储,后续进行离线校正。4)Apache Flink等框架支持将迟到数据路由到侧输出(side output),方便单独处理。5)设计上需权衡延迟容忍度与结果准确性。
- 编程用窗口函数计算 7 天滚动平均。好回答应覆盖
- AVG窗口函数
- ROWS BETWEEN 6 PRECEDING
- 日期排序与滚动窗口
- 处理缺失日期的RANGE选项
- 时间复杂度O(n)
查看范例答案
使用AVG()窗口函数计算7天滚动平均,需按日期排序并指定窗口范围为前6行到当前行(共7行)。例如:SELECT date, value, AVG(value) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_avg。此方法假设数据连续,若日期不连续,应使用RANGE BETWEEN INTERVAL '6' DAY PRECEDING AND CURRENT ROW 确保基于日期间隔。时间复杂度O(n),空间复杂度O(1)(除结果集外)。
参考代码sql SELECT date, value, AVG(value) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS rolling_avg_7d FROM daily_metrics; - 系统设计为一家电商公司的分析需求设计数据仓库。好回答应覆盖
- 事实表与维度表设计
- 星型或雪花型
- 时间维度和缓慢变化维度
- 数据分层(ODS/DWD/DWS/ADS)
- 划分与分桶策略
查看范例答案
针对电商分析需求,数据仓库设计应遵循星型或雪花型模型,核心事实表包括订单事实、支付事实、访问日志事实等,维度表包括商品、用户、时间、店铺、类别等。时间维度通常细化到日,以支持日、周、月、季度分析。缓慢变化维度(SCD)可采用type2记录历史,如商品价格变化。数据分层:ODS层原始数据,DWD层清洗明细数据,DWS层轻度聚合(如每日用户汇总),ADS层应用指标。为支持高并发查询,可对大型事实表按日期分区,对维度表做复制分布。瓶颈在于大表join,可使用分桶或物化视图缓解。
- 行为面讲一次你发现并修复数据质量问题的经历。好回答应覆盖
- STAR方法(情境、任务、行为、结果)
- 数据质量检查自动化
- 根源分析与修复措施
- 监控与警报机制
- 协作与文档记录
查看范例答案
一次我发现数据管道中某张表的销售额出现异常负值。通过追查,发现上游源系统的退款数据被错误地累加了两次。我立即暂停流水线,编写数据验证脚本确认问题范围,并联系上游团队修复逻辑。随后我增加了数据质量检查器,包括非负校验和总和一致性校验,并在失败时发送警报。最终问题解决,数据恢复准确,此经历使我建立了Data Quality Dashboard,将检查覆盖率提升到90%。关键是从根源修复,并建立预防机制。
- 行为面你如何在流水线可靠性和新需求之间排优先级?好回答应覆盖
- SLA与业务影响评估
- 技术债务与可维护性
- 增量迭代与快速回滚
- 利益相关者沟通
- 自动化测试覆盖率
查看范例答案
优先考虑流水线可靠性,因为数据错误可能导致业务决策失误。当新需求与可靠性冲突时,我会评估其业务价值和紧急程度,并和利益相关者沟通折中方案,例如降低新功能初版范围,确保核心可靠性不受影响。同时,我会推动在开发新需求时同步增强监控和测试(比如增加断言),避免引入新漏洞。实践中采用特性开关和蓝绿部署,使新功能可快速回滚。长期看,通过积累自动化测试和混沌工程,可兼顾两者。
面试官重点考察什么
SQL
窗口函数、连接、查询优化与执行计划。
数据建模
星型/雪花模型、分区与缓慢变化维度。
流水线
ETL/ELT、编排、幂等性与回填。
批处理与流式
Spark、Kafka,以及延迟和吞吐之间的取舍。
数据质量
校验、血缘,以及处理迟到或重复数据。
如何准备
- 磨好 SQL——窗口函数和优化几乎每一轮都会出现。
- 设计流水线时,先讲幂等、重试和回填。
- 主动提数据质量和血缘;这能体现你的生产成熟度。
常见问题
数据工程师面试需要多少 SQL?
很多——通常有多轮 SQL,涵盖连接、窗口函数和优化,往往基于贴近真实的表结构。
数据工程面试会出哪些系统设计题?
设计数据仓库、事件流水线,或批/流架构,重点关注分区、幂等和数据质量。
如何准备数据工程面试?
每天刷 SQL,开口练流水线设计,并用模拟面试演练如何讲清各种取舍。
用即时 AI 反馈刷数据工程师面试题
Offersly 会根据你的简历和目标岗位定制一场模拟面试,并从相关性、深度、清晰度和正确性四个维度为每个回答打分。