暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大厂数据仓库面试必刷18题:90%的offer收割机都靠它!(建议收藏)

陈乔数据观止 2025-08-14
1066

推荐阅读:

数据仓库面试必看:这5个技术问题让无数候选人当场崩溃!

数据仓库经典面试题附参考答案(建议收藏)

以下是大厂高级数据仓库工程师面试中常见问题的详细解答,涵盖大数据体系理解、数仓架构、建模思想、数据质量、计算引擎原理、实时架构以及SQL实战等内容。内容深入浅出,适合中高级岗位准备。


面试题列表

1、对大数据体系整体的一个理解是怎么样的?

2、数仓架构与分层,这样分层的好处?

3、数仓维度建模思想,PK维度建模异同与利弊?

4、数仓有哪些主题域,如何划分?

5、主题建模、过程建模,分别适用场景和如何做的?

6、你们制定了哪些数仓规范,分别说一下?

7、模型优化项目做过哪些具体的动作,有哪些收益?

8、如何保障数据质量?

9、如何管理指标和保障一致性?

10、HDFS的读写过程(client,namenode,datanode)?

11、数据倾斜的场景与解决方法?

12、spark与MapReduce 计算对比,map、reduce数?

13、Spark宽依赖,窄依赖区别,哪些算子有shuffle?

14、RDD中reduceBykey与groupByKey哪个性能好,为什么?

15、flink和hadoop、spark有什么区别,优势在哪?

16、join的实现原理?

17、实时技术架构,你的理解和存在的问题?

17、SQL面试题,1)用户留存模型 2)波峰波谷SQL 3)连续n日登陆


扫码添免费获取福利(备注资料)。文末有更多资料哦。



1. 对大数据体系整体的一个理解是怎么样的?

回答要点:

大数据体系是一个围绕海量数据采集、存储、处理、分析和服务的完整技术生态,其核心目标是实现数据驱动决策。主要包括以下几个层次:

  1. 数据源层(Data Sources)

    • 包括业务系统(如ERP、CRM)、日志系统(Nginx、App日志)、IoT设备、第三方API等。
    • 数据类型多样:结构化(MySQL)、半结构化(JSON)、非结构化(图片、文本)。
  2. 数据采集层(Ingestion)

    • 工具:Flume、Kafka、Logstash、Sqoop、DataX、Flink CDC。
    • 实时/离线采集并存,Kafka常用于实时管道。
  3. 数据存储层(Storage)

    • HDFS:分布式文件系统,适合大文件存储。
    • HBase:列式存储,支持随机读写。
    • Hive:基于HDFS的数据仓库,支持SQL查询。
    • S3/对象存储:云原生常用。
  4. 资源调度与计算引擎层

    • 离线批处理:MapReduce、Spark。
    • 实时流处理:Flink、Storm、Spark Streaming。
    • 多模态:Spark Structured Streaming。
    • 资源管理:YARN、Kubernetes。
    • 计算框架:
  5. 数据仓库与数据湖层

    • 数仓(Data Warehouse):结构化建模,主题域划分,服务于BI和报表。
    • 数据湖(Data Lake):原始数据存储,支持多种格式,灵活性高(如Delta Lake、Iceberg)。
    • 湖仓一体趋势明显(如Databricks、阿里云Hologres)。
  6. 数据服务与应用层

    • BI工具:Superset、Tableau、Power BI。
    • 数据API服务:提供指标查询接口。
    • 推荐系统、风控模型等AI应用。
  7. 元数据管理 & 数据治理

    • 元数据:表结构、血缘关系、字段含义。
    • 数据质量监控、权限控制、生命周期管理。

✅ 总结: 大数据体系是“采集 → 存储 → 计算 → 建模 → 服务”的闭环,强调可扩展性、容错性、高并发与一致性。

2. 数仓架构与分层,这样分层的好处?

常见的数据仓库分层架构(以5层为例):

  1. ODS层(Operation Data Store):原始数据层,保持数据原貌不做处理
  2. DWD层(Data Warehouse Detail):明细数据层,对ODS数据进行清洗转换
  3. DWS层(Data Warehouse Service):服务数据层,面向主题的轻度汇总
  4. ADS层(Application Data Store):应用数据层,面向业务的个性化统计
  5. DIM层(Dimension):维度表层,存储一致性维度

分层的好处

  • 清晰数据结构:每层有明确职责,便于理解和使用
  • 减少重复开发:规范数据从原始到应用的全流程
  • 统一数据口径:保证数据一致性
  • 简化复杂问题:将复杂ETL流程分解到各层
  • 数据血缘追踪:便于数据溯源和影响分析
  • 隔离原始数据:保护原始数据不被直接访问和修改

3. 数仓维度建模思想,PK维度建模异同与利弊?

维度建模思想: 由Ralph Kimball提出,以分析需求为驱动,通过事实表(Fact)和维度表(Dimension)构建星型或雪花模型。

维度建模 vs 范式建模(3NF):

比较项
维度建模
范式建模(3NF)
设计目标
查询性能优化
减少数据冗余
结构
星型/雪花模型
实体关系模型
表数量
较少(宽表)
较多(规范化)
适用场景
分析型系统
事务型系统
灵活性
较差(预先设计)
较好(适应变化)
查询复杂度
简单
复杂(多表连接)

利弊分析

  • 维度建模优点:查询性能高,理解简单,适合分析场景
  • 维度建模缺点:数据冗余,灵活性差,ETL复杂
  • 范式建模优点:数据一致性好,更新效率高
  • 范式建模缺点:查询性能差,不适合分析场景

实际应用中,常采用"维度建模+适当冗余"的混合模式。

4. 数仓有哪些主题域,如何划分?

常见主题域划分:

  1. 用户主题:用户属性、行为、画像等
  2. 商品主题:商品信息、类目、价格等
  3. 交易主题:订单、支付、退款等
  4. 物流主题:仓储、配送、库存等
  5. 营销主题:活动、优惠券、广告等
  6. 服务主题:客服、售后、评价等
  7. 财务主题:账务、结算、发票等
  8. 风控主题:欺诈识别、异常监控等

划分原则

  • 按业务过程划分(如订单、支付等)
  • 按业务部门划分(如销售、财务等)
  • 按分析视角划分(如用户、商品等)
  • 保持主题域内高内聚,主题域间低耦合
  • 每个主题域有明确的负责人和边界

5. 主题建模、过程建模,分别适用场景和如何做的?

主题建模(Subject-Oriented Modeling):

  • 适用场景:面向分析需求,强调数据如何被使用
  • 做法
    1. 识别关键业务主题(如用户、商品)
    2. 定义主题边界和关系
    3. 设计星型/雪花模型
    4. 确定事实表和维度表
    5. 设计层次结构和属性

过程建模(Process-Oriented Modeling):

  • 适用场景:面向数据生产过程,强调数据如何被加工
  • 做法
    1. 分析业务过程和数据流
    2. 识别关键实体和关系
    3. 设计规范化模型(3NF)
    4. 定义数据转换规则
    5. 设计ETL流程和数据质量检查点

对比

  • 主题建模适合分析型应用,过程建模适合操作型系统
  • 主题建模以用户需求为驱动,过程建模以业务流程为驱动
  • 实际项目中常结合使用,过程建模为底层,主题建模为上层

6. 你们制定了哪些数仓规范,分别说一下?

常见数仓规范包括:

  1. 命名规范

    • 表命名:层次_主题_描述_周期,如dwd_trade_order_di
    • 字段命名:snake_case风格,如user_id
  2. 模型设计规范

    • 分层定义和职责
    • 事实表和维度表设计标准
    • 缓慢变化维处理方案
  3. 开发规范

    • SQL编写规范(缩进、注释等)
    • ETL开发流程
    • 脚本版本管理
  4. 数据质量规范

    • 完整性、准确性、一致性标准
    • 数据监控指标和阈值
    • 问题处理流程
  5. 指标管理规范

    • 指标命名和口径定义
    • 派生指标和原子指标管理
    • 指标一致性保障机制
  6. 安全规范

    • 数据分级和访问控制
    • 敏感数据脱敏规则
    • 审计日志要求
  7. 运维规范

    • 任务调度和依赖配置
    • 资源分配标准
    • 故障处理流程

7. 模型优化项目做过哪些具体的动作,有哪些收益?

模型优化动作

  1. 分区优化

    • 将大表按日期、业务线等合理分区
    • 收益:查询扫描数据量减少70%
  2. 分桶优化

    • 对高频JOIN字段进行分桶
    • 收益:JOIN性能提升50%
  3. 数据压缩

    • 采用Snappy/ZSTD压缩格式
    • 收益:存储节省40%
  4. 冗余设计

    • 适当增加冗余字段减少JOIN
    • 收益:查询响应时间缩短60%
  5. 维度降维

    • 将多层雪花模型简化为星型模型
    • 收益:模型复杂度降低,ETL效率提高
  6. 冷热分离

    • 将历史冷数据归档到低成本存储
    • 收益:热数据查询性能提升,存储成本降低30%
  7. 索引优化

    • 对高频查询条件建立合适索引
    • 收益:点查性能提升10倍

总体收益

  • 查询性能平均提升3-5倍
  • 存储成本降低30-50%
  • ETL任务运行时间缩短40%
  • 资源使用效率提高

8. 如何保障数据质量?

数据质量保障体系:

  1. 事前预防

    • 制定数据标准和规范
    • 设计合理的数仓模型
    • 建立数据血缘关系
  2. 事中监控

    • 完整性:非空检查、枚举值检查
    • 准确性:值域检查、逻辑规则检查
    • 一致性:跨表一致性检查、指标一致性检查
    • 及时性:数据到达时间监控
    • 设置质量阈值和告警机制
  3. 事后治理

    • 质量问题跟踪和修复
    • 数据质量评分和报告
    • 定期数据质量审计
  4. 技术工具

    • 数据质量检测工具(Griffin、DQC等)
    • 数据血缘工具(Atlas等)
    • 自定义监控脚本
  5. 组织流程

    • 明确数据Owner职责
    • 建立数据质量SLA
    • 质量问题闭环处理流程

9. 如何管理指标和保障一致性?

指标管理方法

  1. 指标分层

    • 原子指标:最细粒度指标,如订单金额
    • 派生指标:原子指标+统计维度,如每日订单金额
    • 复合指标:多个指标计算得出,如转化率
  2. 统一元数据

    • 建立指标中心,集中管理所有指标
    • 记录指标名称、定义、口径、维度、数据源等
    • 维护指标的血缘关系和变更历史
  3. 一致性保障

    • 相同指标统一数据来源和计算逻辑
    • 派生指标必须基于原子指标构建
    • 指标变更需要评审和影响分析
  4. 技术实现

    • 使用指标管理系统或数据字典
    • 通过视图或中间表实现指标逻辑
    • 自动化指标一致性检查
  5. 组织流程

    • 设立指标治理委员会
    • 制定指标开发和维护流程
    • 定期进行指标一致性审计

10. HDFS的读写过程(client,namenode,datanode)?

HDFS写流程

  1. Client向NameNode发起文件写入请求
  2. NameNode检查权限和文件是否存在,返回可写入的DataNode列表
  3. Client将文件分块(Block),建立数据管道(pipeline)
  4. Client将第一个Block写入管道中的第一个DataNode
  5. 第一个DataNode接收数据并写入本地,同时转发给第二个DataNode
  6. 第二个DataNode同样操作,直到最后一个DataNode
  7. 管道确认信息逆向返回给Client
  8. 完成一个Block写入后,继续写入下一个Block
  9. 所有Block写入完成后,Client通知NameNode提交文件

HDFS读流程

  1. Client向NameNode发起文件读取请求
  2. NameNode返回文件Block所在的DataNode列表(按网络拓扑排序)
  3. Client选择最近的DataNode建立连接
  4. DataNode发送数据给Client
  5. 如果第一个Block读取完成,继续从下一个Block的DataNode读取
  6. 所有Block读取完成后,Client合并成完整文件

11. 数据倾斜的场景与解决方法?

常见倾斜场景

  1. Group By倾斜:某些key数据量远大于其他
  2. Join倾斜:关联键分布不均
  3. 分区倾斜:分区策略不合理导致某些分区过大
  4. Skew Join:大表关联小表但小表key集中

解决方法

  1. 参数调优

    • 设置hive.map.aggr=true
      (map端聚合)
    • 调整hive.groupby.skewindata=true
      (两阶段聚合)
    • 增加reduce数(set mapred.reduce.tasks=N
      )
  2. SQL改写

    • 倾斜key单独处理再UNION ALL
    • 将随机前缀加到倾斜key上分散数据
    • 小表JOIN大表改为MAP JOIN(/*+ MAPJOIN(b) */
      )
  3. 业务调整

    • 与业务方沟通修改数据分布
    • 过滤掉异常倾斜数据
    • 改变分区策略
  4. 特殊处理

    • 对倾斜key采样估算后单独增加reduce资源
    • 使用SkewJoin优化器(如Spark的spark.sql.adaptive.skewJoin.enabled
      )

12. spark与MapReduce 计算对比,map、reduce数?

Spark vs MapReduce

对比项
Spark
MapReduce
计算模型
基于内存的DAG
严格的Map-Shuffle-Reduce
性能
快(内存计算)
慢(磁盘IO)
API
丰富(DataFrame,SQL,Streaming等)
单一(Map/Reduce)
容错
RDD血缘关系
数据复制
资源利用
高(动态资源分配)
低(静态slot)
适用场景
迭代计算、交互查询
一次性批处理

map/reduce数确定

  • MapReduce

    • map数:由输入数据量和分片大小决定(mapred.max.split.size
      )
    • reduce数:用户指定(mapred.reduce.tasks
      ),默认1
  • Spark

    • 分区数(类似map数):由输入源决定,可repartition()
      调整
    • shuffle分区数:由spark.sql.shuffle.partitions
      控制(默认200)

Spark的优化在于可以自动调整分区,且不需要严格区分map和reduce阶段。

13. Spark宽依赖,窄依赖区别,哪些算子有shuffle?

宽依赖 vs 窄依赖


窄依赖
宽依赖
定义
子RDD每个分区依赖父RDD少量分区
子RDD每个分区依赖父RDD多个分区
特点
一对一或多对一
一对多
是否shuffle
容错
只重新计算丢失分区的父分区
可能重新计算多个父分区
示例
map、filter、union
groupByKey、reduceByKey

会引起shuffle的算子

  • 重分区:repartition
    coalesce
    (部分情况)
  • 聚合:groupByKey
    reduceByKey
    aggregateByKey
  • 连接:join
    cogroup
    intersection
  • 排序:sortBy
    sortByKey
  • 去重:distinct

14. RDD中reduceBykey与groupByKey哪个性能好,为什么?

reduceByKey性能更好,原因:

  1. Combiner优化

    • reduceByKey
      会在map端先进行本地聚合(combiner)
    • groupByKey
      直接传输所有数据,不进行map端聚合
  2. 数据传输量

    • reduceByKey
      传输的是聚合后的数据,量更小
    • groupByKey
      传输原始数据,量大
  3. 内存使用

    • reduceByKey
      内存压力小
    • groupByKey
      可能引起OOM(当key对应的value很多时)

使用建议

  • 需要聚合时优先使用reduceByKey
  • 只有在需要保留所有value时才用groupByKey
  • 类似优化的还有aggregateByKey
    foldByKey

15. flink和hadoop、spark有什么区别,优势在哪?

Flink vs Hadoop/Spark

对比项
Flink
Spark
Hadoop MR
计算模型
流批一体
微批处理
批处理
延迟
毫秒级
秒级
分钟级+
状态管理
完善
有限
时间语义
事件时间、处理时间
主要处理时间
容错
分布式快照
RDD血缘
数据复制
资源调度
灵活
较灵活
静态
API
DataStream/DataSet
RDD/DataFrame
Map/Reduce
适用场景
实时处理、有状态计算
批处理、准实时
离线批处理

Flink优势

  1. 真正的流处理:非微批架构,低延迟
  2. 流批统一:同一套API处理流批场景
  3. 事件时间支持:完善的时间语义和窗口机制
  4. 状态管理:支持大规模有状态计算
  5. Exactly-once:精确一次语义保证
  6. 高吞吐低延迟:性能优于Spark Streaming

16. join的实现原理?

常见Join实现方式

  1. Nested Loop Join

    • 双重循环匹配
    • 适合小表join小表
  2. Hash Join

    • 阶段1:对小表构建hash表
    • 阶段2:扫描大表在hash表中查找匹配
    • 适合小表join大表
  3. Sort Merge Join

    • 阶段1:对两表按join key排序
    • 阶段2:归并扫描匹配记录
    • 适合大表join大表
  4. Broadcast Join

    • 将小表广播到所有节点
    • 与大表本地join
    • Spark中spark.sql.autoBroadcastJoinThreshold
      控制
  5. Shuffle Hash Join

    • 按join key分区
    • 每个分区内hash join
    • 适合中等表join
  6. Semi/Anti Join

    • 只关心是否存在匹配
    • 可优化为半连接

分布式环境下的Join优化

  • 尽量让join在分区内完成
  • 小表广播避免shuffle
  • 倾斜key特殊处理
  • 合理设置并行度

17. 实时技术架构,你的理解和存在的问题?

实时技术架构理解

典型Lambda架构和Kappa架构:

  1. Lambda架构

    问题:两套代码维护成本高,结果一致性难保证

    • 批层:处理全量数据,保证准确性
    • 速度层:处理增量数据,保证低延迟
    • 服务层:合并批流结果
  2. Kappa架构

    问题:消息队列存储成本高,长窗口计算资源消耗大

    • 只有流处理层,历史数据通过重放处理
    • 简化架构,一套代码

现代实时架构趋势

  • 流批一体(Flink)
  • 实时数仓(实时ODS→DWD→DWS)
  • 状态化流处理
  • 实时OLAP(ClickHouse/Druid)

存在的问题

  1. 资源消耗:实时计算需要长期占用资源
  2. 状态管理:故障恢复和扩缩容复杂
  3. 数据一致性:精确一次语义实现成本高
  4. 长窗口计算:内存和存储压力大
  5. 实时离线对齐:结果不一致时的处理策略
  6. 监控运维:复杂度高于批处理

18. SQL面试题

1) 用户留存模型

-- 计算次日留存率、3日留存率、7日留存率
WITH
first_day_users AS (
    SELECT
        user_id,
        MIN(event_date) AS first_day
    FROM user_events
    GROUPBY user_id
),

retention_stats AS (
    SELECT
        first_day,
        COUNT(DISTINCT f.user_id) AS new_users,
        COUNT(DISTINCTCASEWHENDATEDIFF(e.event_date, f.first_day) = 1THEN e.user_id ENDAS day1_retained,
        COUNT(DISTINCTCASEWHENDATEDIFF(e.event_date, f.first_day) = 2THEN e.user_id ENDAS day2_retained,
        COUNT(DISTINCTCASEWHENDATEDIFF(e.event_date, f.first_day) = 6THEN e.user_id ENDAS day7_retained
    FROM first_day_users f
    LEFTJOIN user_events e ON f.user_id = e.user_id
    GROUPBY first_day
)

SELECT
    first_day,
    new_users,
    day1_retained,
    day2_retained,
    day7_retained,
    ROUND(day1_retained * 100.0 / new_users, 2AS day1_retention_rate,
    ROUND(day2_retained * 100.0 / new_users, 2AS day3_retention_rate,
    ROUND(day7_retained * 100.0 / new_users, 2AS day7_retention_rate
FROM retention_stats
ORDERBY first_day;

2) 波峰波谷SQL

-- 找出每日访问量的波峰和波谷
WITH daily_visits AS (
    SELECT
        visit_date,
        COUNT(*) AS visit_count,
        LAG(COUNT(*), 1OVER (ORDERBY visit_date) AS prev_count,
        LEAD(COUNT(*), 1OVER (ORDERBY visit_date) AS next_count
    FROM user_visits
    GROUPBY visit_date
)

SELECT
    visit_date,
    visit_count,
    CASE
        WHEN visit_count > prev_count AND visit_count > next_count THEN'peak'
        WHEN visit_count < prev_count AND visit_count < next_count THEN'valley'
        ELSE'normal'
    ENDAS peak_valley_status
FROM daily_visits
ORDERBY visit_date;

3) 连续n日登陆

-- 找出连续登录至少5天的用户
WITH
user_login_dates AS (
    SELECTDISTINCT
        user_id,
        login_date
    FROM user_logins
),

login_groups AS (
    SELECT
        user_id,
        login_date,
        DATE_SUB(login_date, ROW_NUMBER() OVER (PARTITIONBY user_id ORDERBY login_date)) AS grp
    FROM user_login_dates
),

consecutive_logins AS (
    SELECT
        user_id,
        grp,
        MIN(login_date) AS start_date,
        MAX(login_date) AS end_date,
        COUNT(*) AS login_days
    FROM login_groups
    GROUPBY user_id, grp
    HAVINGCOUNT(*) >= 5
)

SELECT
    user_id,
    start_date,
    end_date,
    login_days
FROM consecutive_logins
ORDERBY login_days DESC, user_id;


据统计,99%的大咖都关注了这个公众号👇

大家都在看:

数据仓库分层设计:ODS/DWD/DWS/ADS到底该怎么划边界?

Doris vs StarRocks vs ClickHouse:新一代MPP引擎的终极对决

Hive优化十大法则:让慢查询从2小时降到5分钟的秘籍

数据仓库中的“一致性维度”是什么?为什么它能统一指标口径?(文末送福利)

数据血缘 vs 数据目录:元数据管理的两大核心,谁更重要?(文末送数据治理体系解决方案ppt)

80%的数据项目失败,竟是因为忽略了元数据!(附元数据技术架构设计方案ppt)

数据仓库监控体系搭建:任务告警/资源调度的自动化方案

数据标准落地难?3个步骤让企业数据“说同一种语言”!

数据治理必杀技:如何用数据血缘提升数据质量?

从0到1搭建元数据管理体系,看这篇就够了!

数据仓库架构设计:如何避免常见的陷阱?

数据治理搞了3年还是乱?90%的企业都踩了这几个坑

扫码加入星球🪐 所有资料都可以直接下载

文章转载自陈乔数据观止,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论