生而为人

程序员的自我修养

0%

数据仓库面试宝典二

[toc]

数据仓库(实时+离线)面试宝典(2026最新版)

核心定位:本宝典适配数据仓库开发工程师、实时数仓工程师、大数据开发工程师(初级/中级/高级),全覆盖离线数仓+实时数仓,聚焦数仓架构、建模方法论、计算引擎、分层规范、数据治理、SQL优化、业务落地,贴合互联网/金融/电商/车企大厂面试题库,话术直白、可直接背诵,对标2026年主流技术栈(Hive3、Flink1.19、Doris、StarRocks、CDC、OneData)。

核心原则:大厂数仓面试固定四大优先级:数仓分层与建模 > 离线+实时架构链路 > 引擎原理与调优 > 数据治理+项目落地,拒绝零散知识点,统一大厂标准化话术,全部贴合面试官标准答案。

第一部分:面试前置准备(自我介绍+职级能力)

一、标准化自我介绍(直接背诵,适配所有数仓岗位)

1、1分钟精简版(初面、笔试后一面)

面试官您好,我从事大数据数据仓库开发工作X年,精通离线数仓+实时数仓全链路建设,熟练掌握Hive、Flink、Spark、Kafka、Doris等主流组件,精通维度建模、分层规范、缓慢变化维度、拉链表、数据集市。主导过电商/金融行业数仓搭建,熟练进行数据清洗、分层建模、指标体系建设、SQL优化、数据质量监控,擅长解决数据倾斜、数据延迟、重复、漂移问题,能够独立完成离线报表、实时大屏、业务指标开发,具备完整的数据治理经验。

2、3分钟专业版(复面、技术主管面)

面试官您好,我叫XX,拥有X年大数据数仓开发经验,深耕离线+实时混合数仓架构,熟悉行业通用分层规范与OneData统一指标体系。

技术层面:离线方向熟练掌握Hive调优、Spark批处理、分层建模、缓慢变化维度、拉链表、分区分桶、数据缓慢变化处理;实时方向精通Flink流式计算、CDC增量同步、Kafka消息队列、实时宽表、Doris/StarRocks实时分析;熟练使用DataX、SeaTunnel做数据同步,掌握维度建模、范式建模,精通SQL高阶优化、数据倾斜治理、数据质量监控。

业务层面:参与/主导过电商交易、用户行为、金融风控、流量分析类数仓项目,从需求评审、指标拆解、模型设计、任务开发、调度运维、数据治理全流程负责,搭建过ODS-DWD-DWS-ADS标准分层,完成实时大屏、离线报表、用户画像、复购转化指标体系建设。

我擅长复杂业务建模、慢SQL优化、大规模任务调度治理、实时链路延迟优化,严格遵循数据口径统一、分层复用、数据规范原则,保证数据准确、稳定、可追溯,希望入职贵司深耕数据仓库,为业务提供高质量数据支撑。

二、职级能力划分(精准对标面试要求)

  • 初级(1-2年):会写Hive SQL、简单Flink SQL、懂分层、会同步数据、能跑通调度、听懂业务指标,能独立开发DWD/ADS层,了解拉链表、分区。
  • 中级(3-5年):精通建模、精通倾斜优化、会设计宽表、能搭建实时链路、精通CDC、精通Doris/StarRocks、能独立维护指标体系、治理脏数据。
  • 高级(5年+):能做架构选型、混合数仓架构设计、统一指标平台、数据中台、数据治理规范、元数据管理、成本优化、跨部门口径统一。

第二部分:高频核心考点(离线+实时,大厂必考)

模块一:数仓基础概念(入门必背,送分题)

一、核心知识点

  1. 数据库 VS 数据仓库(必考)
    1. 数据库:面向业务、OLTP、增删改查频繁、保存当前业务数据、范式建模、追求事务一致性。
    2. 数据仓库:面向分析、OLAP、只读为主、保存历史全量数据、维度建模、追求整合、分析、复用。
  2. ETL & ELT 区别
    1. ETL:抽取、转换、加载,转换在外部,适合传统离线数仓,清洗重、耗时高。
    2. ELT:抽取、加载、转换,原始数据先入仓,计算在数仓内部,适合云原生、实时数仓、Doris/StarRocks。
  3. 四大基本特征(数仓标准定义)
    1. 面向主题:按业务主题划分(交易、用户、商品、流量)。
    2. 集成性:多源业务系统数据统一清洗、规整。
    3. 非易失:数据写入极少删除修改,历史永久留存。
    4. 时变性:带有时间维度,保留历史快照,可回溯。

二、高频面试题(标准答案)

  1. 问:为什么要做数据仓库?直接查业务库不行吗? 答:① 业务库承受不了大查询、报表、聚合分析,容易压垮线上业务;② 业务库分散多源,数据孤立,数仓统一整合;③ 业务库无历史快照,无法回溯历史数据;④ 数仓分层建模,指标复用、口径统一;⑤ 数仓专门做OLAP,聚合查询性能更强。
  2. 问:什么是脏数据?怎么处理? 答:脏数据包括:空值、异常值、重复数据、乱码、业务逻辑错误、格式不统一。处理方式:ODS原样保留;DWD层清洗过滤、空值替换、异常剔除、格式统一;DWS层做业务逻辑校验;建立数据质量监控告警。
  3. 问:数据仓库分层的意义? 答:① 解耦:原始数据不改动,中间层隔离;② 复用:明细层通用,上层集市直接复用;③ 容错:分层回溯,出错快速定位;④ 简化开发:每层职责单一;⑤ 口径统一:避免重复计算、重复开发。

模块二:离线数仓架构(大厂主流五分层)

一、分层标准(全网统一大厂话术)

通用分层:ODS、DWD、DWS、DIM、ADS(必背)

  1. ODS原始数据层:原样同步业务库、日志数据,不做清洗,保留原始结构,支持回溯;格式最全、冗余最高。同步工具:DataX、Canal、SeaTunnel。
  2. DWD明细事实层:清洗、去重、过滤、补空、规整,单业务明细,保持粒度最细,不聚合;遵循一业务一事实表。
  3. DWS聚合宽表层:按维度聚合,构建宽表,常用指标预聚合,比如用户日活、商品交易额、地区汇总;减少上层重复计算。
  4. DIM维度层:所有维度表,用户、商品、地区、门店;维护缓慢变化维度、拉链表,保存维度历史快照。
  5. ADS应用集市层:面向业务最终报表、大屏、看板、推送;指标高度定制,直接给业务方使用。

二、离线完整链路(背诵版)

业务MySQL/日志 → DataX/Canal同步 → ODS层(Hive) → DWD清洗过滤 → DWS聚合宽表 → DIM维度关联 → ADS报表指标 → 同步BI/报表平台。

三、高频面试题

  1. 问:ODS为什么不清洗? 答:ODS定位是原始备份,业务数据随时可能需要回溯排查;原始数据不能丢失,清洗放在DWD层,保证分层职责单一,便于故障回滚。
  2. 问:DWD和DWS区别? 答:DWD是明细、粒度最细、不聚合;DWS是聚合、宽表、预计算、降低查询压力;DWD用于明细查询,DWS用于指标统计。
  3. 问:大表join怎么优化? 答:① 大表过滤前置,减少数据量;② 合理分区,按时分区裁剪;③ 小表广播join;④ 倾斜key单独打散;⑤ 开启MapJoin;⑥ 避免笛卡尔积;⑦ 拆分复杂SQL,分步执行。

模块三:数仓建模(面试重中之重)

一、建模分类

1、范式建模(Inmon)

三范式、减少冗余、关系复杂、多张表关联;适合传统数仓、金融、银行;查询慢、关联多。

2、维度建模(Kimball,互联网主流)

事实表+维度表,以业务过程为中心;冗余高、查询快、易懂;互联网、电商、大厂全部使用。

二、三大模型(必背)

  1. 星型模型:一张事实表关联多张维度表,维度表不关联;结构简单、查询最快;互联网主流。
  2. 雪花模型:维度表继续拆分,层级更深;冗余低、关联多、查询慢;传统金融使用。
  3. 星座模型:多张事实表共用维度表;企业级数仓通用,节省维度维护成本。

三、缓慢变化维度SCD(必考)

  1. SCD1 直接覆盖:新值覆盖旧值,无历史;适用于不重要维度。
  2. SCD2 拉链表(大厂最常用):新增一行历史数据,用开始时间、结束时间标记生命周期;保留全部快照,支持任意时间回溯。
  3. SCD3 新增字段:新增一列保存旧值;只保留最近一次变更,适合简单维度。

四、高频面试题

  1. 问:拉链表怎么做?适用场景? 答:适用维度缓慢变化场景,例如用户地区、商品分类、店铺等级。做法:每日增量同步,比对维度字段;变更则旧数据结束时间更新为昨天,新增一条新数据开始时间为今天,结束时间为9999-12-31;实现永久快照、无损回溯。
  2. 问:事实表和维度表区别? 答:事实表:存度量、指标、行为、数值,量大、更新频繁;维度表:存描述、属性、分类,量小、变化慢。

模块四:离线核心引擎(Hive+Spark)

一、Hive核心考点

  1. 分区:按时间、地区分区;分区裁剪,减少扫描数据;常用静态分区+动态分区。
  2. 分桶:哈希打散,相同key进入同一桶;优化join、抽样、去重。
  3. 存储格式:Text(原始)、ORC(列式、压缩高、数仓首选)、Parquet(通用、兼容所有引擎)。
  4. 压缩:Snappy(速度快)、Gzip(压缩率高)。

二、数据倾斜(面试最高频痛点)

1、倾斜常见原因

key重复、空值过多、热点key、数据分布不均、业务本身倾斜。

2、通用解决方案(背诵顺序)
  1. 空值打散:空值拼接随机数,单独打散;
  2. 热点key拆分:热点key单独处理,非热点正常join;
  3. MapJoin:小表广播,避免shuffle;
  4. 加盐打散:给倾斜key加随机后缀,聚合再合并;
  5. 参数调优:开启倾斜自动优化、调整reduce个数。

三、高频Hive面试题

  1. 问:Hive内部表和外部表区别?

    答:内部表:删除表同时删数据,管理严格;外部表:删表仅删元数据,数据保留;生产全部使用外部表,防止误删数据。

  2. 问:Hive动态分区注意事项?

    答:必须开启动态分区参数;严格模式限制全动态分区;分区字段放最后;避免大量小分区。

模块五:实时数仓架构(2026必考重点)

一、实时vs离线区别

维度 离线数仓 实时数仓
延迟 T+1、小时级 秒级/分钟级
引擎 Hive/Spark Flink
存储 HDFS Kafka+Doris/StarRocks
成本 低、吞吐高 高、资源占用大
用途 报表、复盘、归档 大屏、监控、实时预警

二、实时数仓主流分层(四层)

  1. ODS实时层:Canal CDC同步MySQL、日志入Kafka,原始消息不处理。
  2. DWD实时明细层:Flink消费Kafka,清洗、过滤、脱敏、规整,下发明细Kafka。
  3. DWS实时聚合层:Flink窗口聚合、累计指标、构建实时宽表,写入Doris。
  4. ADS实时应用层:Doris对外服务,大屏、接口、实时告警、推送。

三、实时核心组件讲解

  1. CDC增量同步:监听binlog,捕获增删改,无需全量抽数,不压业务库;主流Canal、Debezium。
  2. Kafka:实时数仓存储介质,缓存数据流,削峰填谷,多分区提高并发。
  3. Flink:实时计算、窗口、状态、回撤、维表关联; Exactly-Once保证数据不丢不重。
  4. Doris/StarRocks:实时分析、低延迟、高并发、支持明细+聚合,替代传统Druid、Kylin。

四、实时高频面试题

  1. 问:实时宽表怎么做?

    答:以用户/订单为主键,Flink双流join、维表join,将常用维度、行为、属性全部合并为一张大宽表;减少上层重复关联,提升查询速度;维度采用Redis缓存、Lookup关联。

  2. 问:实时数据怎么保证不重复不丢失?

    答:Kafka开启副本、acks=1;Flink开启Checkpoint、Exactly-Once;消费offset持久化;事务写入Doris;故障自动重启、状态恢复。

  3. 问:数据漂移、乱序怎么解决?

    答:使用事件时间+水位线Watermark;设置乱序容忍时间;迟到数据侧输出单独处理;分区有序、业务主键去重。

模块六、OLAP引擎(Doris+StarRocks,2026最热)

一、核心区别(面试必背)

  1. Apache Doris:运维简单、兼容MySQL、电商互联网主流、更新友好、实时写入稳定。
  2. StarRocks:查询性能更强、向量化极致优化、复杂报表更快、大厂高端数仓首选。

二、表模型

  1. Aggregate:预聚合,指标汇总;
  2. Unique:唯一键,去重、更新;
  3. Duplicate:明细模型,原始明细存储。

模块七:数据治理(中高级必问)

1、四大治理方向

  • 数据质量:完整性、准确性、一致性、及时性;配置监控规则、失败告警。
  • 数据标准:字段命名、业务口径、编码格式统一,OneData方法论。
  • 元数据治理:血缘分析、字段溯源、任务依赖、影响分析。
  • 成本治理:小文件合并、无效任务下线、冷数据归档、分区生命周期。

2、小文件治理(高频)

危害:NameNode压力大、查询卡顿、任务耗时高;

解决方案:定时合并、调整输出分片、减少随机写入、分区生命周期清理。

模块八:项目实战模板(直接背诵,离线+实时通用)

一、项目名称:电商离线+实时混合数据仓库搭建

1、项目背景

原有数据分散在MySQL业务库、Nginx日志,数据孤立、统计缓慢、无实时监控,T+1报表延迟高,无法支撑业务实时运营;需要搭建统一分层数仓,实现离线复盘+实时大屏双架构。

2、技术栈

DataX、Canal、Hive3.1、Spark3.5、Flink1.19、Kafka3.6、Doris2.1、Redis、Azkaban、Prometheus。

3、个人职责
  1. 数据同步:使用Canal监听MySQL binlog,实时同步增量数据入Kafka;DataX每日全量同步业务库至Hive ODS层。
  2. 离线建模:遵循五分层规范,完成交易、用户、商品主题建模;DWD清洗去重,DWS构建用户行为宽表,DIM维护拉链表缓慢变化维度。
  3. 实时开发:Flink消费Kafka,完成实时清洗、双流join、窗口聚合;构建实时交易宽表,写入Doris,支撑实时大屏。
  4. 性能优化:解决交易表热点key倾斜,采用加盐打散+拆分热点;优化Hive小文件,合并分片;优化Flink水位线解决乱序漂移;P95查询延迟降低60%。
  5. 治理运维:搭建数据质量监控,配置空值、重复、波动告警;梳理数据血缘,下线无效任务;规范字段命名、统一指标口径。
4、项目难点与解决方案
  1. 难点1:订单数据倾斜,热门商家数据量大;方案:拆分热点key、加盐打散、分桶聚合。
  2. 难点2:实时数据乱序、漂移;方案:事件时间+水位线,设置5分钟乱序容忍,迟到数据单独补批。
  3. 难点3:维度频繁变更;方案:DIM层制作拉链表,永久保留历史快照。
5、项目成果

搭建完整离线+实时混合数仓;离线每日生成200+业务报表,实时大屏延迟稳定在3秒内;数据准确率99.95%;任务失败率下降90%;支撑运营、风控、商品分析多业务线。

第三部分:面试兜底话术+避坑总结

一、面试官最爱追问清单(必背)

  1. 你们公司数仓分层怎么分?——严格回答ODS/DWD/DWS/DIM/ADS,每层职责复述一遍。
  2. 实时和离线怎么结合?——离线做复盘、历史、宽表打底;实时做监控、大屏、预警;冷热分层、混合存储。
  3. 数据不一致怎么排查?——分层比对、分区校验、维度快照比对、增量日志排查、任务执行日志追溯。
  4. 为什么不用Spark做实时?——Spark微批、延迟高、无状态、不适合实时更新;Flink原生流式、状态强大、支持回撤、水位线。

二、2026最新技术趋势(拔高加分)

  • 实时离线一体化:统一计算、统一元数据、统一口径;
  • 湖仓一体:Hudi/Iceberg,支持实时更新、历史回溯;
  • 云原生数仓:Doris、StarRocks替代传统Hive数仓;
  • AI+数仓:智能异常检测、指标预测、自动分级治理。

第四部分:必考SQL手写题 + 大数据算法(面试默写版)

前言:本章节全部为面试原题,数仓工程师必考,不需要复杂语法,全部使用Hive SQL通用语法,可直接默写;算法为大数据高频手撕算法,通俗易懂、面试直白话术。

模块一:高频SQL基础面试题(初级必背)

1、行转列、列转行(必考)

(1)行转列:多行合并为一行(常用:商品标签、用户标签)

业务场景:一个用户多条标签,合并为一条、逗号分隔。

标准答案SQL:

1
2
3
4
5
6
-- Hive/Spark SQL
select
user_id,
concat_ws(',',collect_list(tag)) as tag_list
from user_tag
group by user_id;

面试话术背诵:行转列使用collect_list无序聚合、collect_set去重聚合,搭配concat_ws拼接字符串,常用于标签合并、多属性合并。

(2)列转行:一行拆多行(标签拆分)

业务场景:一条数据多个标签,拆分多条明细。

标准答案SQL:

1
2
3
4
5
select 
user_id,
tag
from user_info
lateral view explode(split(tag_list,',')) t as tag;

面试话术背诵:使用lateral view炸裂函数,搭配explode数组拆分,split切割字符串,实现列转行,常用于标签拆分、多维拆解。

2、分组取TopN(高频手撕)

业务场景:每个部门薪资最高前2人、每个商品类目销量TOP3。

标准答案SQL:

1
2
3
4
5
6
7
8
9
select * from (
select
dept_id,
user_name,
salary,
row_number() over(partition by dept_id order by salary desc) as rn
from emp
) t
where rn <= 2;
三大排序函数区别(必背)
  1. row_number():连续不重复,1234(排名无并列)
  2. rank():跳跃排名,1224(并列跳过)
  3. dense_rank():连续排名,1223(并列不跳)

3、去重方案(面试追问)

方式1:distinct(少量数据、简单去重)
1
select distinct user_id from log;
方式2:group by(大数据量去重,推荐)
1
select user_id,max(dt) from log group by user_id;
方式3:row_number(复杂条件去重,生产最常用)
1
2
3
4
select * from (
select *,row_number() over(partition by user_id order by dt desc) rn
from log
)t where rn=1;

面试话术:生产环境禁止大表distinct,容易触发数据倾斜,优先row_number分组去重。

模块二:业务进阶SQL(数仓中级必考)

1、连续签到问题(大厂经典原题)

需求:统计每个用户连续签到天数、最长连续签到。

解题思路(背诵逻辑)

  1. 先开窗排序,给用户日期排序;
  2. 日期减去排序编号,连续日期得到同一分组标记
  3. 根据分组标记聚合,统计连续天数。

标准答案SQL:

1
2
3
4
5
6
7
8
9
10
11
12
select 
user_id,
min(dt) start_dt,
max(dt) end_dt,
count(1) continue_days
from (
select
user_id,dt,
date_sub(dt,row_number() over(partition by user_id order by dt)) as flag
from sign_log
)t
group by user_id,flag;

2、用户留存率(数仓重中之重)

需求:计算每日新增用户、次日留存、7日留存。

留存定义:当天新增用户,后续某天再次活跃。

标准答案SQL:

1
2
3
4
5
6
7
8
9
10
11
12
13
select 
today.dt,
count(distinct today.user_id) as new_user,
count(distinct tomorrow.user_id) as retain_1d
from (
select dt,user_id from user_new
) today
left join (
select dt,user_id from user_active
) tomorrow
on today.user_id = tomorrow.user_id
and tomorrow.dt = date_add(today.dt,1)
group by today.dt;

面试话术背诵:留存使用自关联,当天新增表关联未来活跃表;离线留存T+1计算,实时留存使用Flink状态做当日留存。

3、漏斗转化分析(电商、金融必问)

业务:浏览-加购-下单-支付,每一步转化率。

解题思想:同一用户行为路径、判断是否走完下一个节点。

1
2
3
4
5
6
select 
sum(if(step=1,1,0)) as view_cnt,
sum(if(step=2,1,0)) as cart_cnt,
sum(if(step=3,1,0)) as order_cnt,
sum(if(step=4,1,0)) as pay_cnt
from user_funnel;

面试话术:漏斗核心逻辑是用户行为埋点、行为编号,分层统计人数,计算转化率;大厂一般使用Flink实时漏斗、离线Hive漏斗。

4、累计指标(日累计销售额、累计用户)

开窗函数 rows between 边界,生产高频。

1
2
3
4
5
select 
dt,
sale_amount,
sum(sale_amount) over(order by dt rows between unbounded preceding and current row) as total_amount
from sale_data;

关键字背诵:unbounded preceding(首行)、current row(当前行)。

模块三:SQL优化高频问答(面试必问)

  1. where和having区别? where分组前过滤,不经过shuffle;having分组后过滤,性能差;优先where过滤。
  2. order by底层原理? Hive两次排序,map端局部排序、reduce端全局排序,数据量大产生磁盘溢写。
  3. 开窗函数优缺点? 优点:减少join、代码简洁;缺点:大数据量分区容易倾斜、内存占用高。
  4. 大表关联优化? 前置过滤、分区裁剪、广播join、倾斜key打散、避免笛卡尔积。

模块四:大数据手撕算法(面试必考,直白背诵)

1、洗牌算法(随机打乱、抽样)

适用场景:用户随机抽样、风控随机打散。

算法思想:从后往前遍历,当前位置与随机位置交换,时间复杂度O(n)。

面试背诵话术:Fisher-Yates洗牌,保证概率均匀、无偏,大数据抽样常用,Hive中order by rand()底层就是洗牌算法。

2、蓄水池抽样算法(海量数据随机取样)

面试原题:亿级数据随机抽取100条,内存放不下全部数据怎么做?

原理背诵

  1. 先初始化蓄水池,放入前k条数据;
  2. 遍历后续每条数据,以k/i概率替换蓄水池;
  3. 最终每条数据被选中概率相等。

使用场景:Hive抽样、日志随机采样、风控黑名单抽样。

3、数据倾斜算法(高频)

原理话术:数据倾斜本质是hash分区不均匀,热点key落在同一个reduce。解决方案:空值打散、加盐随机、热点key拆分、局部聚合。

4、LRU缓存淘汰算法(Redis、维度缓存必考)

面试原题:Redis缓存满了怎么淘汰?

原理背诵:最近最少使用淘汰,链表维护访问顺序,头部最新、尾部最久未使用;淘汰尾部节点;Redis近似LRU。

数仓场景:Redis缓存维度表、用户画像、热点特征,使用LRU淘汰冷数据。

5、布隆过滤器(去重、黑名单)

面试话术:二进制数组+多个哈希函数;判断一定不存在、不一定存在;优点内存极小;缺点无法删除、存在误判。

业务场景:用户去重、黑名单过滤、日志重复判断。

6、TopK 海量数据求最大/最小K个数(大数据必考)

面试原题:10亿条访问日志,找出访问量最高的100个IP,内存放不下全部数据怎么做?

算法原理(背诵)

  1. 采用小顶堆解决最大TopK;大顶堆解决最小TopK;
  2. 维持堆容量为K,遍历全部数据;
  3. 堆未满直接放入,堆满后比较堆顶;大于堆顶替换堆顶;
  4. 遍历结束堆内即为最大K个数据。

大数据生产应用:热门商品、热点IP、倾斜key排查、流量TOP排行。

面试话术:海量数据求TopK不能全局排序,时间复杂度太高;使用小顶堆,时间复杂度O(nlogK),内存只保留K个元素,适合超大数据量。

7、位图算法 BitMap(海量去重、状态标记)

面试原题:1亿用户ID,判断用户是否登录,怎么极致节省内存?

原理背诵

  1. 利用二进制bit位存储状态,一个int占4字节可以存32个状态;
  2. ID对应下标,存在置为1,不存在置为0;
  3. 优点:极度省内存、查询极快;
  4. 缺点:ID必须为整型、连续、不能过大。

数仓应用场景:日活用户去重、签到状态、用户黑白名单、用户留存标记。

8、一致性哈希算法(Kafka、Redis、分库分表必考)

面试原题:Kafka分区为什么能保证同一个key发送到同一个分区?扩容为什么不会大量迁移数据?

原理背诵

  1. 构建0~2^32环形哈希环;
  2. 节点IP哈希落在环上,数据key哈希顺时针找最近节点;
  3. 新增节点只影响相邻一小部分数据,不会全局重分布;
  4. 优化:增加虚拟节点,解决数据倾斜、节点不均匀。

大数据应用:Kafka分区路由、Redis集群、分库分表、数据分片。

9、滑动窗口算法(Flink实时必考)

面试原题:Flink滚动窗口、滑动窗口底层原理?

算法原理

  1. 固定窗口大小,不断向前滑动;
  2. 滑动步长 < 窗口大小产生数据重叠;
  3. 只维护窗口内最新数据,过期数据丢弃;
  4. 时间复杂度极低,适合流式实时计算。

业务场景:实时最近1小时交易额、最近30秒流量、实时告警、滑动留存。

10、快速排序(大数据最常用排序、面试手写)

原理背诵:选取基准值,小于基准放左边、大于基准放右边;递归拆分;平均时间复杂度O(nlogn)。

大数据优化点:Hive、Spark底层排序都是优化快排;结合外排序解决磁盘海量数据排序。

面试话术:大数据生产不用冒泡,全部使用快速排序,无序海量数据效率最高。

11、外排序算法(海量大文件排序)

面试原题:一个100G日志文件,内存只有4G,怎么排序?

解题步骤(必背)

  1. 拆分:大文件切分成多个小文件;
  2. 内排序:内存中快速排序,生成有序小文件;
  3. 归并排序:多路归并,最终输出一个全局有序大文件。

生产应用:Hive大表排序、离线超大日志排序、历史数据规整。

12、中位数算法(海量数据求中位数)

面试原题:十亿条交易金额,求交易中位数,内存放不下?

解法话术:双堆法,大顶堆存前半段、小顶堆存后半段;堆顶即为中位数;海量数据配合分片抽样,近似中位数。

13、贪心算法(数仓指标、资源调度)

原理:每一步只做当前最优选择,不回溯;局部最优推全局最优。

大数据场景:Azkaban调度资源分配、任务优先级、压缩策略、冷热数据存储选型。

14、冷热分离算法(中高级数仓必问)

原理背诵

  1. 热数据:近7天,高频查询,存放SSD、Doris、Kafka;
  2. 温数据:近30天,中低频,存放HDFS;
  3. 冷数据:超90天,归档、压缩、低成本存储。

生产作用:降低存储成本、提升查询速度、优化集群压力。

15、大数据去重三大算法(面试总结)

  1. 布隆过滤器:超大批量、允许误判、不删除;黑名单、日志去重。
  2. BitMap位图:整型连续ID、极致省内存;用户签到、日活去重。
  3. Hash表:精准去重、占用内存大;中小批量明细去重。

模块五:面试手写SQL万能模板(直接默写)

1、通用开窗模板

1
row_number() over(partition by 分组字段 order by 排序字段 desc) rn

2、通用去重模板

1
2
3
select * from (
select *,row_number() over(partition by id order by dt desc) rn
)t where rn=1

3、累计求和模板

1
sum(col) over(order by dt rows between unbounded preceding and current row)

4、分组内占比模板

1
count(1)/sum(count(1)) over(partition by class_id)

模块六:大数据算法面试终极总结(一句话背诵)

  1. 抽样:蓄水池抽样、洗牌算法;
  2. 去重:布隆过滤器、位图、Hash;
  3. 排序:快速排序、外排序;
  4. TopK:大小顶堆;
  5. 流式:滑动窗口、水位线;
  6. 分片:一致性哈希;
  7. 优化:贪心、冷热分离。

模块七:大数据进阶手撕算法(面试压轴必问,新增完整版)

说明:以下算法只保留面试能用、大数据数仓必考,全部直白通俗,不用深层源码,面试直接口述。

1、二分查找算法(海量有序数据快速查询)

面试原题:百亿条有序时间数据,怎么最快查到某条记录?

原理背诵:有序数组,每次取中间值比较,折半缩小范围;时间复杂度O(logN)。

大数据场景:Hive分区查找、索引查询、Doris有序列快速过滤、日志时间检索。

面试话术:海量有序数据优先二分查找,比遍历快得多;数仓中用于分区裁剪、有序索引定位。

2、双指针算法(去重、有序合并、区间判断)

原理:快慢指针、左右指针;一次遍历完成去重、合并、区间筛选。

大数据场景:有序大文件合并、日志去重、连续时间段筛选、行为轨迹分析。

面试举例:两个有序超大日志文件,双指针一趟遍历合并为一个有序文件。

3、链表算法(LRU底层、Flink状态链表)

原理背诵:单向链表、双向链表;插入删除快、查询慢;LRU底层=哈希表+双向链表。

大数据场景:Redis缓存、Flink状态管理、Kafka偏移量链表维护。

4、栈&队列算法(消息积压、任务调度)

:后进先出;用于括号匹配、递归回溯、任务回滚。

队列:先进先出;Kafka消息队列、任务排队、流量削峰。

阻塞队列:Flink线程池、Spark资源调度、生产消费模型。

5、递归算法(树形层级、维度层级)

原理:自己调用自己,拆分重复子问题;注意递归深度防止栈溢出。

数仓场景:商品类目层级、地区树形结构、部门层级、血缘溯源。

6、二叉树算法(血缘分析、层级结构)

面试必考:前序、中序、后序、层序遍历。

大数据场景:数据血缘树、任务依赖树、菜单类目树、索引B+树。

面试话术:数据平台血缘分析底层采用二叉树遍历,递归追溯上游依赖表。

7、多路归并算法(海量文件合并)

面试原题:100个有序大文件,合并成一个全局有序文件?

原理:每个文件保留一个指针,最小堆维护最小值;每次取出最小写入结果。

生产场景:Hive合并小文件、日志合并、离线大排序、历史数据规整。

8、频率统计算法(热门商品、热点key排查)

原理:Hash统计频次,结合TopK找出高频key。

数仓用途:倾斜key排查、热点用户、爆款商品、恶意IP限流。

9、雪花算法(分布式唯一ID)

结构背诵:时间戳+机器码+序列号;全局唯一、趋势递增、无重复。

大数据场景:订单ID、埋点日志ID、分布式数据表主键、Flink唯一标识。

10、负载均衡算法(中间件必考)

  1. 轮询:均匀分发;
  2. 随机:随机分发;
  3. 加权轮询:高性能节点多分配;
  4. 一致性哈希:固定key固定节点;

场景:Kafka分区分发、Redis集群、服务网关、集群负载。

11、限流三大算法(实时风控、流量压测)

  1. 计数器限流:固定时间计数,简单粗暴;
  2. 滑动窗口限流:平滑流量,避免临界突刺;
  3. 令牌桶:允许突发流量,实时大屏流量控制;

生产场景:埋点日志限流、风控防刷、Kafka流量削峰。

12、字典树Trie(前缀匹配、日志过滤)

原理:字符逐层存储,公共前缀共享节点;查询极快、节省内存。

场景:URL黑名单、敏感词过滤、日志前缀筛选、域名匹配。

13、正则匹配算法(数据清洗)

数仓用途:清洗手机号、身份证、URL、特殊乱码、脏数据过滤;DWD层高频使用。

14、哈希算法(大数据基石)

面试话术:哈希算法将任意长度数据转为定长哈希值;用于去重、分片、加密、路由。

生产应用:shuffle分区、分桶、一致性哈希、布隆过滤器、文件校验。

模块八:大数据算法终极分类(一页纸背诵清单)

1、海量数据处理:蓄水池、位图、布隆、外排序、多路归并、TopK

2、分片路由算法:一致性哈希、哈希取模、负载均衡

3、流式实时算法:滑动窗口、水位线、限流、令牌桶

4、基础高频算法:快排、二分、双指针、递归、栈队列、链表

5、工程实用算法:雪花ID、字典树、正则、贪心、冷热分离

6、去重算法三件套:BitMap > 布隆过滤器 > Hash表

模块九:算法一页纸极简口诀(面试前10分钟速背)

说明:全部最短口诀,不记原理、不记代码,面试张口就说,专门针对大数据数仓开发。

一、海量数据处理(超大文件、内存不够)

  • 洗牌算法:倒序遍历、随机交换、均匀抽样,hive rand()底层。
  • 蓄水池抽样:先存k个、概率替换、海量无偏抽样。
  • TopK堆排序:大堆求最小、小堆求最大,内存只留k个。
  • 外排序:大文件切小文件、内部快排、多路归并。
  • 中位数:双堆维护,一大一小,堆顶为中位。

二、去重算法(面试最高频)

  • BitMap位图:整型id、bit存状态、极致省内存、不能存大数。
  • 布隆过滤器:二进制数组+多哈希、能判不存在、不能删、有误判。
  • Hash表:精准去重、占用内存大、中小数据使用。

三、分片&路由(中间件必考)

  • 哈希算法:任意长度转定长,分区、分桶、去重全靠它。
  • 一致性哈希:环形哈希、新增节点少迁移、kafka、redis用。
  • 负载均衡:轮询均匀、加权择优、哈希固定、随机分发。

四、实时流式算法(Flink必考)

  • 滑动窗口:窗口固定、步长滑动、数据重叠、统计最近时段。
  • 水位线:标记时间、处理乱序、容忍延迟、剔除迟到。
  • 限流算法:计数器简单、滑动平滑、令牌桶扛突发流量。
  • LRU缓存:哈希+双向链表、淘汰最久未使用、redis底层。

五、基础手撕算法(简单但必问)

  • 快排:基准值、左右划分、递归、大数据默认排序。
  • 二分查找:有序数据、折半查询、速度最快。
  • 双指针:一趟遍历、合并有序、去重、区间筛选。
  • 链表:增删快、查询慢、flink状态、偏移量。
  • 栈队列:栈后进先出,队列先进先出,消息削峰。
  • 二叉树:前中后层序遍历,数据血缘、索引底层。

六、工程实战算法(工作常用)

  • 数据倾斜:分区不均、热点key、空值加盐、拆分打散。
  • 多路归并:最小堆合并有序文件、hive合并小文件。
  • 雪花算法:时间+机器+序号、全局唯一递增id。
  • 字典树:前缀匹配、敏感词、url黑名单过滤。
  • 贪心算法:局部最优、资源调度、任务优先级。
  • 冷热分离:热数据ssd、温数据hdfs、冷数据归档压缩。
  • 正则匹配:清洗脏数据、手机号、特殊字符剔除。

七、算法终极顺口溜(背这一段全部拿捏)

海量抽样蓄水池,去重位图布隆池;

分片一致哈希环,实时窗口水位齐;

堆求top快排序,二分指针最简单;

倾斜加盐打散用,冷热归档省机器;

工程雪花唯一id,缓存LRU永不弃。

第五部分:面试简短兜底总结(面试最后自我介绍收尾)

我熟练掌握离线+实时数仓建设,精通Hive、Flink、Doris;熟悉分层建模、拉链表、缓慢变化维度;能够独立完成同步、清洗、建模、指标开发;精通SQL优化、数据倾斜、小文件治理;了解湖仓一体、CDC实时同步;具备数据治理、监控、调优实战经验,能够快速适配业务需求,产出高质量、高准确、高稳定的数据指标。