一、SQL 模块
1. 说一下 LAG 和 LEAD 窗口函数的作用和使用场景?
答:LAG 是取当前行上一行 的数据,LEAD 是取当前行下一行 的数据。使用时必须先 PARTITION BY 分组,再 ORDER BY 组内排序。常用在计算环比、同比、用户连续登录、前后时间差、拿上一条记录指标这些业务场景。
2. ROW_NUMBER、RANK、DENSE_RANK 有什么区别?适用场景?
答:ROW_NUMBER 是连续编号,1234,同分也不并列、不跳号;RANK 同分同排名,后面会跳号,1224;DENSE_RANK 同分同排名,后面不跳号,1223。分组取第一条用 ROW_NUMBER;评奖排名用 RANK;做档位分层用 DENSE_RANK。
3. 窗口函数里 PARTITION BY 和 ORDER BY 分别作用是什么?
答:PARTITION BY 是用来按照字段分组,每个组内部单独计算;ORDER BY 是组内排序,确定行与行的先后顺序,没有排序 LAG、LEAD 取值就会不准。
4. 怎么用 SQL 求用户连续登录最大天数?
答:首先对用户登录日期去重,再用 LAG 拿到上一次登录日期,计算两天日期差值,差值不变的就是连续区间,最后按用户和区间分组,统计最大连续天数。
5. 如何实现分组内取前 N 条数据?
答:使用 ROW_NUMBER 窗口函数,先按维度分区、组内排序,最后筛选编号小于等于 N 就可以实现。
6. 内连接、左连接、右连接、全外连接有什么区别?
答:内连接只保留左右表能匹配上的数据;左连接以左表为基准,右表匹配不到补 NULL;右连接以右表为基准,左表匹配不到补 NULL;全外连接保留左右表所有数据,匹配不上都补 NULL。
7. 左连接为什么会出现数据重复、数据膨胀?怎么解决?
答:主要是右表是一对多关系,一条左表记录匹配到右表多条记录,就会产生重复行。解决办法是先把右表做去重或者聚合,再和左表关联。
8. 笛卡尔积是怎么产生的?工作中怎么避免?
答:多表关联没有写关联条件,或者关联条件失效,就会产生笛卡尔积,数据量会爆炸。工作中多表关联必须写正确的关联主键、外键条件,不能随意乱放多张表不加约束。
9. DISTINCT 和 GROUP BY 去重有什么区别?
答:DISTINCT 是整行去重,适合简单去重;GROUP BY 分组去重,还可以搭配聚合函数做统计,效率更高,适合业务指标统计。
10. 什么是行转列、列转行?怎么实现?
答:行转列一般用 CASE WHEN 加分组聚合实现;列转行在普通 SQL 用 UNION ALL,在 Hive 里用 lateral view + explode 炸裂函数实现。
11. CASE WHEN 日常用在什么场景?
答:做多条件分支判断、自定义指标档位、行列转换、业务分类统计、分层分级都常用。
12. NULL 在 SQL 里有什么坑?
答:COUNT (字段) 不会统计 NULL 值;GROUP BY 会把所有 NULL 归为同一组;不能用 = NULL 判断空,只能用 IS NULL / IS NOT NULL;NULL 不参与等值比较。
13. 普通子查询和关联子查询有什么区别?
答:普通子查询先执行子查询,再执行外层查询;关联子查询是外层每一行驱动子查询执行,性能比较差,工作中尽量少用。
14. 什么情况会触发全表扫描?
答:没有建索引、索引失效、索引列做函数运算、LIKE 以百分号开头、数据量太小数据库自动放弃索引,都会走全表扫描。
15. 索引一般在什么情况下会失效?
答:索引列做函数或算术运算、隐式类型转换、LIKE % 开头模糊查询、OR 两边有一列没有索引、字段区分度太低,都会导致索引失效。
16. 过滤条件放 WHERE 还是 HAVING?
答:普通过滤条件放 WHERE,先过滤再聚合,性能更好;聚合之后的统计条件,只能放在 HAVING 里。
17. 大表关联小表怎么优化?
答:提前过滤减少数据量、关联字段建索引、小表驱动大表、严格写好关联条件,避免笛卡尔积。
二、Hadoop 口述自问自答
1. Hadoop 核心由哪几部分组成?各自作用?
答:主要三部分:HDFS、YARN、MapReduce。HDFS 是分布式文件系统,用来存储海量离线数据;YARN 是集群资源调度框架,负责管理 CPU、内存和任务调度;MapReduce 是离线分布式计算引擎,用来做海量数据处理。
2. NameNode 和 DataNode 职责是什么?
答:NameNode 负责管理整个集群元数据,包括文件目录、权限、数据块位置,接收客户端请求;DataNode 负责实际存储数据块,定时向 NameNode 上报心跳和块信息。
3. HDFS 副本机制了解吗?
答:默认 3 副本,存放策略是同节点不放多副本,同机架存一份,剩余副本跨不同机架存储,兼顾容错和网络开销。
4. HDFS 适合存什么数据?不适合什么?
答:适合海量大文件、一次写入多次读取、离线冷数据;不适合大量小文件、频繁修改、低延迟随机读写的业务。
5. ResourceManager 和 NodeManager 作用?
答:ResourceManager 是全局资源调度器,接收任务申请、分配集群资源;NodeManager 是单个节点的资源管理者,负责启动容器、监控本地任务运行。
6. 伪分布式和完全分布式区别?
答:伪分布式所有进程都部署在单台机器,适合学习、测试、练项目;完全分布式多台机器分开部署角色,用于企业生产集群。
7. 你搭建 Hadoop 伪分布式步骤是什么?
答:先配置服务器免密登录,安装配置 JDK,修改 Hadoop 核心配置文件,格式化 HDFS,最后启动 DFS 和 YARN 集群。
8. Hadoop 常用启停命令?
答:启动:start-dfs.sh、start-yarn.sh停止:stop-dfs.sh、stop-yarn.sh
三、Hive 口述自问自答
1. 什么是 Hive?
答:Hive 是基于 Hadoop 的数据仓库工具,可以把我们写的 SQL 自动翻译成 MapReduce 或者 Spark 任务,不用手写分布式代码,适合海量离线数据统计分析。
2. Hive 和 MySQL 有什么区别?
答:MySQL 面向业务实时交易,支持频繁增删改、低延迟、数据量不大;Hive 面向海量离线批处理,不适合实时增删改,延迟高,适合大数据量统计分析。
3. 内部表和外部表区别?工作中用哪种?
答:内部表元数据和数据都由 Hive 管理,删表会连带删除原始数据;外部表只管理元数据,删表只删元数据,原始数据保留在 HDFS。工作中一般推荐用外部表,安全不会丢原始数据。
4. 什么是分区表?作用是什么?
答:分区表是按照时间、地区等字段,在 HDFS 上分目录存储数据;作用是缩小查询扫描范围,避免全表扫描,大幅提升查询效率,最常用时间分区。
5. 分区和分桶有什么区别?
答:分区是目录级别划分,分桶是文件级别按哈希打散;分区用来缩小查询范围,分桶适合抽样查询、大表关联优化。
6. Hive 小文件产生原因、危害、解决办法?
答:原因:任务拆分过多、分区过小、动态分区、数据倾斜;危害:占用 NameNode 大量元数据内存、查询效率低;解决:设置参数合并小文件、合理分区、控制并行度。
7. Hive 简单优化你知道哪些?
答:查询先加分区过滤、避免全表扫描、大表小表用 Map 端 Join、合理设置并行度、定时合并小文件。
四、Linux Shell 口述自问自答
1. 日常常用 Linux 命令有哪些?
答:目录操作:pwd、ls、cd、mkdir文件操作:touch、cp、mv、rm -rf查看日志:cat、head、tail、tail -f查找过滤:grep、find进程管理:ps -ef、kill -9磁盘查看:df -h、du -sh权限:chmod、chown
2. grep 一般用来做什么?
答:主要用来过滤文本关键字,工作中经常用来筛选日志报错、排查程序异常。
3. tail -f 作用是什么?
答:实时跟踪日志文件末尾,线上服务、大数据任务运行时,用来实时看日志、排查问题非常常用。
4. 怎么查看并过滤 Java 进程?
答:先用 ps -ef 查看所有进程,再用管道 | 搭配 grep java 过滤出 Java 相关进程。
5. 管道 | 有什么作用?
答:把前一个命令的输出结果,当作后一个命令的输入,常用在日志过滤、进程筛选。
6. tar 打包解压常用参数?
答:-zcvf 用来打包压缩,-zxvf 用来解压,日常打包日志、项目包经常用。
五、数据仓库理论 口述自问自答
1. 数仓四层分层 ODS、DWD、DWS、ADS 每层作用?
答:ODS 原始层:同步业务系统原始数据,不做处理;DWD 明细层:做数据清洗、去重、过滤脏数据,保留业务明细;DWS 汇总层:按用户、时间、业务维度做聚合,形成宽表;ADS 应用层:面向报表、看板、业务指标,直接给业务使用。
2. 什么是事实表、什么是维度表?
答:事实表存放业务行为、度量值、数值记录,数据量大、变化快;维度表存放描述性信息,比如时间、地区、用户、产品属性,相对固定。
3. 星型模型和雪花模型区别?
答:星型模型是一张事实表直接关联所有维度表,结构简单、查询效率高,工作最常用;雪花模型维度表再拆分多层子维度,结构复杂,实际项目用得少。
4. 什么是缓慢变化维?
答:维度表的属性会随着时间发生变化,比如用户地区、产品分类变更;一般三种处理方式:直接覆盖、新增历史行、加时间有效期标记。
5. 数据仓库和业务数据库有什么区别?
答:业务库面向联机交易,支持实时增删改、高并发;数仓面向离线分析,以读为主、不频繁修改,用来做海量数据统计和指标分析。