Loading......

文章背景图

字节 Hive面试核心知识点笔记 📚

2026-01-08
12
-
- 分钟

说明:本笔记从字节面试官视角整理,聚焦数据开发岗位中 Hive 的高频考察点,涵盖基础概念、核心特性(视图、分桶、分区等)、SQL 实操、性能优化、底层原理等模块,每个知识点包含「核心定义 + 面试考点 + 详细解析」,兼顾基础与深度,适合面试备考与知识梳理。

一、Hive基础核心概念🔍

1. 什么是Hive?其核心定位与应用场景

核心定义:Hive 是基于 Hadoop 的数据仓库工具,通过类 SQL(HQL)语言将数据查询请求转换为 MapReduce/Tez/Spark 等计算引擎的任务,实现对 HDFS 等分布式存储中大规模数据的离线分析。

面试考点:Hive 与传统数据库的区别、Hive 的核心组件、Hive 的计算引擎选型

详细解析

  • 核心定位:不是数据库,而是「数据仓库工具」,专注离线批处理(不支持实时查询,如 MySQL 的即时增删改查),适用于 TB/PB 级海量数据的离线分析、数据建模、报表生成等场景。

  • 与传统数据库(MySQL)的区别: 维度 Hive 传统数据库(MySQL)存储依赖 HDFS,分布式存储本地文件系统 / 云存储,集中式计算 MapReduce/Tez/Spark(批处理)单机计算(支持实时交互)事务支持 Hive 3.0+ 支持 ACID,但非核心场景(多用于离线,少更新)完全支持 ACID,适合高频增删改查延迟高延迟(分钟 / 小时级)低延迟(毫秒 / 秒级)数据规模 TB/PB 级海量数据 GB 级以内,小规模数据

  • 核心组件:

    • metastore:元数据存储(表结构、分区信息、存储路径等),默认存在 Derby 数据库,生产环境常用 MySQL(避免单进程限制,支持多用户共享)。

    • Driver:接收 HQL 请求,解析、编译、优化生成执行计划,提交给计算引擎。

    • Execution Engine:执行任务(MapReduce/Tez/Spark),Tez 和 Spark 比 MapReduce 效率更高(减少 Shuffle 阶段的磁盘 IO)。

2. Hive的元数据(Metastore)详解

核心定义:元数据是描述 Hive 数据的数据,记录了表的基本信息(表名、列名、数据类型)、存储信息(存储位置、文件格式)、分区信息、权限信息等。

面试考点:Metastore 的存储方式、Metastore 的作用、生产环境 Metastore 的配置优化

详细解析

  • 存储方式:

    • 嵌入式模式(默认):元数据存储在 Derby 数据库,Derby 是单进程数据库,同一时间只能有一个 Hive 客户端访问,适合测试环境,不适合生产。

    • 本地模式:元数据存储在 MySQL 等关系型数据库,Metastore 服务与 Hive Driver 在同一进程,MySQL 独立部署,支持多客户端访问,适合小规模集群。

    • 远程模式:Metastore 服务独立部署(多进程),Hive 客户端通过网络连接 Metastore 服务,再由服务连接 MySQL,适合大规模集群(字节生产环境常用此模式,支持高可用)。

  • 核心作用:避免直接操作 HDFS 解析数据结构,通过元数据快速定位数据存储位置和格式,提升查询效率;统一管理表结构,支持多用户共享数据。

  • 生产优化:使用 MySQL 存储元数据,配置连接池(增加并发连接数);开启元数据缓存(减少数据库查询压力);部署 Metastore 高可用(避免单点故障)。

二、Hive核心表特性(重点:视图、分桶)📌

1. Hive表的类型:内部表(管理表)vs 外部表

核心定义:Hive 表按数据管理权限分为内部表和外部表,核心区别在于「删除表时是否删除底层数据」。

面试考点:两者的区别、适用场景、创建语法差异

详细解析

维度

内部表(Managed Table)

外部表(External Table)

数据归属

Hive 完全管理,数据存储在 Hive 默认路径(/user/hive/warehouse/ 表名)

数据不归 Hive 管理,存储路径由用户指定

删除表影响

删除表时,同时删除元数据和底层 HDFS 数据

删除表时,只删除元数据,底层 HDFS 数据保留

适用场景

临时表、中间结果表(数据可随时删除,不影响其他系统)

多工具共享数据(如 Hive 与 Spark、Flink 共用数据)、原始数据存储(避免误删原始数据)

创建语法

CREATE TABLE 表名 (...) [STORED AS ...];

CREATE EXTERNAL TABLE 表名 (...) LOCATION 'hdfs 路径' [STORED AS ...];

面试追问:字节生产环境中,外部表的使用场景更多,为什么?—— 因为字节数据链路复杂,原始数据需要多工具共享(如 Hive 做离线分析,Flink 做实时同步),用外部表可避免删除 Hive 表时误删原始数据,保障数据安全。

2. 分区表(Partition Table)

核心定义:按指定字段(如日期、地区)对数据进行逻辑划分,将不同分区的数据存储在不同的 HDFS 目录下,查询时可通过分区过滤只扫描目标分区数据,减少数据扫描量,提升查询效率。

面试考点:分区表的作用、创建语法、动态分区 vs 静态分区、分区表的优化问题(如数据倾斜、小文件)

详细解析

  • 核心作用:减少查询时的扫描数据量(如查询 2024 年 1 月的订单数据,只扫描 2024-01 分区,无需扫描全量订单数据),提升查询效率。

  • 创建语法(以日期分区为例): -- 单分区表(按天分区) CREATE EXTERNAL TABLE order_info ( order_id STRING, user_id STRING, amount DECIMAL(10,2) ) PARTITIONED BY (dt STRING) -- 分区字段(逻辑字段,不占数据列) STORED AS PARQUET LOCATION '/user/dw/order_info'; -- 多分区表(按天+地区分区) CREATE EXTERNAL TABLE order_info ( order_id STRING, user_id STRING, amount DECIMAL(10,2) ) PARTITIONED BY (dt STRING, region STRING) STORED AS PARQUET LOCATION '/user/dw/order_info';

  • 静态分区 vs 动态分区:

    • 静态分区:插入数据时,手动指定分区值(适合分区数量少、已知分区值的场景)。 INSERT INTO order_info PARTITION (dt='2024-01-01') SELECT order_id, user_id, amount FROM tmp_order WHERE dt='2024-01-01';

    • 动态分区:插入数据时,分区值由查询结果自动推断(适合分区数量多、未知分区值的场景,如每日批量同步数据)。-- 开启动态分区(默认关闭) set hive.exec.dynamic.partition=true; -- 非严格模式(允许所有分区都是动态的,严格模式要求至少有一个静态分区) set hive.exec.dynamic.partition.mode=nonstrict; -- 最大动态分区数量(避免过多分区导致元数据压力) set hive.exec.max.dynamic.partitions=1000; INSERT INTO order_info PARTITION (dt) SELECT order_id, user_id, amount, dt FROM tmp_order;

  • 常见问题与优化:

    • 小文件问题:每个分区对应多个小文件(HDFS 小文件过多会导致 NameNode 压力大),解决方案:开启 Hive 合并小文件(set hive.merge.mapfiles=true; set hive.merge.mapredfiles=true;)、使用 INSERT OVERWRITE 时合并数据、通过 Spark/Flink 写数据时控制文件数量。

    • 数据倾斜:某一分区数据量过大(如节假日订单量激增),解决方案:拆分分区(如按小时分区)、使用分桶表结合分区表、查询时避免全表扫描,严格过滤分区。

3. 分桶表(Bucket Table)「重点考察」

核心定义:按指定字段的哈希值对数据进行分桶(类似哈希分区),将数据均匀分布到多个文件中,每个分桶对应一个 HDFS 文件。分桶表可提升 join 效率、支持抽样查询。

面试考点:分桶表的作用、与分区表的区别、创建语法、分桶表的优化场景(如 SMB Join)

详细解析

  • 核心作用:

    • 提升 Join 效率:当两个表按相同字段分桶时,Join 操作可转化为「桶与桶之间的 Join」(无需全表笛卡尔积),减少 Shuffle 数据量(如 A 表 5 个桶,B 表 5 个桶,只需 5 次桶内 Join,而非全表 Join)。

    • 支持抽样查询:无需扫描全表,可随机抽取部分分桶数据进行分析(适合大规模数据的快速验证)。

    • 数据均匀分布:通过哈希分桶,避免数据倾斜(前提是分桶字段选择合理,如用户 ID,避免选择枚举值少的字段)。

  • 创建语法(以用户 ID 分桶为例): CREATE EXTERNAL TABLE user_info ( user_id STRING, user_name STRING, age INT, gender STRING ) CLUSTERED BY (user_id) -- 分桶字段 SORTED BY (user_id ASC) -- 可选:桶内数据排序(进一步提升Join效率) INTO 8 BUCKETS -- 分桶数量(一般设为集群CPU核数的整数倍,如8、16) STORED AS PARQUET LOCATION '/user/dw/user_info'; -- 插入分桶数据(需开启分桶功能,默认开启) set hive.enforce.bucketing=true; -- 自动按分桶数量生成对应数量的Reduce Task INSERT INTO user_info SELECT user_id, user_name, age, gender FROM tmp_user;

  • 分桶表 vs 分区表的核心区别:维度分桶表分区表划分依据按字段哈希值(均匀分布)按字段枚举值(如日期、地区,可能不均匀)数据分布均匀(前提是分桶字段合理)可能不均匀(如某些日期数据多)核心作用提升 Join 效率、支持抽样减少查询扫描量适用场景多表 Join、大规模数据抽样分析按固定维度筛选查询(如按天查数据)

  • 分桶表的优化应用:SMB Join(Sort-Merge-Bucket Join)

    • 适用场景:两个大表按相同字段分桶且桶内排序,需要进行 Join 操作(字节生产环境中常用此优化大表 Join)。

    • 原理:将两个表的桶一一对应,对每个桶内的排序数据进行 Merge Join(无需 Shuffle,直接按顺序合并),极大提升 Join 效率。

    • 开启配置: set hive.auto.convert.sortmerge.join=true; -- 自动转化为SMB Join set hive.auto.convert.sortmerge.join.noconditionaltask=true; -- 无条件自动转化 set hive.sortmerge.join.bucket.mapjoin.map.tasks=10; -- 桶内Map Join的任务数

  • 注意事项:

    • 分桶数量选择:一般设为集群 CPU 核数的整数倍(如 8、16),避免分桶过多导致小文件,或分桶过少导致数据不均匀。

    • 分桶字段选择:优先选择基数大、分布均匀的字段(如用户 ID、订单 ID),避免选择枚举值少的字段(如性别,会导致分桶不均匀)。

    • 插入数据时必须开启hive.enforce.bucketing=true,否则 Hive 不会自动按分桶规则生成数据(会生成一个文件,分桶失效)。

4. 视图(View)「重点考察」

核心定义:视图是基于查询语句的虚拟表,不存储实际数据,只存储查询逻辑。通过视图可简化复杂查询、隐藏数据细节、控制数据访问权限。

面试考点:视图的作用、与表的区别、创建语法、视图的限制、字节生产环境中的应用场景

详细解析

  • 核心作用:

    • 简化复杂查询:将多表 Join、复杂过滤的查询逻辑封装为视图,后续查询直接调用视图(如将「用户表 + 订单表 + 商品表」的 Join 逻辑封装为视图,避免重复写复杂 SQL)。

    • 隐藏数据细节:对下游用户隐藏表的结构变化(如修改表字段后,只需同步视图逻辑,下游无需改动)。

    • 控制权限:对敏感数据(如用户手机号)创建视图时过滤,只向用户开放非敏感字段,保障数据安全。

  • 创建与使用语法:-- 创建视图(简化用户订单详情查询) CREATE VIEW v_user_order_detail AS SELECT u.user_id, u.user_name, o.order_id, o.amount, o.dt, p.product_name FROM user_info u JOIN order_info o ON u.user_id = o.user_id JOIN product_info p ON o.product_id = p.product_id WHERE o.dt > '2024-01-01'; -- 查询视图(与查询表完全一致) SELECT * FROM v_user_order_detail WHERE user_id = '1001'; -- 修改视图(替换原有视图逻辑) CREATE OR REPLACE VIEW v_user_order_detail AS SELECT u.user_id, u.user_name, o.order_id, o.amount, o.dt, p.product_name, p.category -- 新增商品分类字段 FROM user_info u JOIN order_info o ON u.user_id = o.user_id JOIN product_info p ON o.product_id = p.product_id WHERE o.dt > '2024-01-01'; -- 删除视图(只删除视图逻辑,不影响原始数据) DROP VIEW v_user_order_detail;

  • 视图的核心限制:

    • 不存储数据:每次查询视图时,都会重新执行视图对应的原始查询语句(如果原始查询复杂,视图查询效率可能较低)。

    • 一般不支持修改操作:Hive 视图默认是只读的,不支持 INSERT/UPDATE/DELETE(除非视图是基于单表且无复杂逻辑,如过滤、排序,生产环境中极少使用)。

    • 依赖原始表:如果原始表被删除或修改字段,视图会失效(查询时报错)。

  • 字节生产环境应用场景:

    • 数据中台分层:在数据仓库的 ODS(原始数据层)、DWD(明细数据层)、DWS(汇总数据层)中,用视图封装分层之间的逻辑(如 DWD 层视图基于 ODS 层表清洗后生成)。

    • 敏感数据脱敏:对包含用户身份证、手机号的表,创建视图时隐藏敏感字段,向业务用户开放视图(如视图中只保留用户 ID、用户名,不保留手机号)。

    • 多团队协作:不同业务团队共享数据时,用视图定义各自的数据集(避免直接访问底层表,减少表结构变更的影响)。

  • 面试追问:Hive 视图与物化视图的区别?—— 物化视图是将视图的查询结果存储为实际数据(类似表),支持快速查询,但需要定期刷新(同步原始数据变化);Hive 默认不支持物化视图,需通过自定义脚本(如定时执行 INSERT OVERWRITE)实现类似功能;字节生产环境中,若需物化视图的效果,一般直接创建汇总表(DWS 层),定时增量更新数据。

三、Hive SQL核心语法与函数💻

1. 常用查询语法(重点:Join、Group By、开窗函数)

面试考点:多表 Join 的类型与适用场景、Group By 优化、开窗函数的使用(字节高频考察)

详细解析

  • 多表 Join 类型:

    • Inner Join(内连接):只保留两个表中匹配的数据(交集)。

    • Left Join(左连接):保留左表所有数据,右表匹配不到的字段为 NULL(字节最常用,如关联用户表和订单表,保留所有用户,包括无订单的用户)。

    • Right Join(右连接):保留右表所有数据,左表匹配不到的字段为 NULL(较少用,可转化为 Left Join)。

    • Full Join(全连接):保留两个表所有数据,匹配不到的字段为 NULL(极少用,适合需要完整数据集合的场景)。

    • Map Join(映射连接):小表 Join 大表时,将小表加载到内存,在 Map 端完成 Join(避免 Shuffle,提升效率),Hive 0.11+ 自动开启(hive.auto.convert.join=true)。 -- Map Join示例(小表user_info,大表order_info) SELECT u.user_name, o.order_id FROM user_info u LEFT JOIN order_info o ON u.user_id = o.user_id; -- Hive自动识别小表,将user_info加载到内存,Map端完成Join

  • Group By 优化:

    • 开启 Map 端聚合(默认开启):set hive.map.aggr=true,在 Map 端先对数据进行部分聚合(减少 Shuffle 数据量)。

    • 设置 Map 端聚合阈值:set hive.map.aggr.hash.min.reduction=0.5,当 Map 端聚合后的数据集减少 50% 以上时才进行聚合。

    • 避免 Group By 数据倾斜:将倾斜字段加上随机前缀(如concat(user_id, '_', rand())),先进行局部聚合,再去掉前缀进行全局聚合。

  • 开窗函数(字节高频考察): 核心作用:对数据进行分组后,在组内进行排序、聚合、取 TopN 等操作(不改变数据行数,区别于 Group By 的聚合后行数减少)。常用开窗函数:

    • 排序函数:-- ROW_NUMBER():组内按顺序编号,不重复(如取每个用户最新的订单) SELECT user_id, order_id, amount, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY create_time DESC) AS rn FROM order_info WHERE rn = 1; -- 取每个用户最新的1个订单 -- RANK():组内排名,重复值排名相同,后续排名跳过(如1,1,3) -- DENSE_RANK():组内排名,重复值排名相同,后续排名不跳过(如1,1,2)

    • 聚合开窗函数: -- 计算每个用户的累计订单金额 SELECT user_id, order_id, amount, SUM(amount) OVER (PARTITION BY user_id ORDER BY create_time) AS total_amount FROM order_info; -- 计算每个用户的平均订单金额(窗口为所有数据) SELECT user_id, order_id, amount, AVG(amount) OVER (PARTITION BY user_id) AS avg_amount FROM order_info;

2. 常用函数(内置函数+自定义函数)

面试考点:常用内置函数的使用、自定义函数(UDF/UDAF/UDTF)的开发与使用场景

详细解析

  • 常用内置函数:

    • 字符串函数:concat(a,b)(拼接字符串)、substr(a, start, length)(截取字符串)、split(a, ',')(按分隔符拆分字符串)、trim(a)(去除前后空格)。

    • 日期函数:from_unixtime(unix_timestamp(), 'yyyy-MM-dd HH:mm:ss')(获取当前时间)、date_format(dt, 'yyyy-MM')(格式化日期)、datediff(dt1, dt2)(计算两个日期差值)、date_add(dt, n)(日期加 n 天)。

    • 条件函数:if(condition, a, b)(条件判断)、case when condition1 then a when condition2 then b else c end(多条件判断,字节常用,如用户等级划分)。

    • 聚合函数:sum()avg()count()max()min()(注意:count(*)包含 NULL,count(字段)不包含 NULL)。

  • 自定义函数(UDF/UDAF/UDTF):

    • UDF(用户自定义函数):一进一出(输入一个值,输出一个值),如自定义字符串脱敏函数(隐藏手机号中间 4 位)。 // 自定义UDF示例:手机号脱敏 import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class PhoneDesensitize extends UDF { public Text evaluate(Text phone) { if (phone == null || phone.toString().length() != 11) { return phone; } String phoneStr = phone.toString(); return new Text(phoneStr.substring(0, 3) + "****" + phoneStr.substring(7)); } } // 编译打包后,在Hive中注册使用: ADD JAR /path/to/phone-desensitize.jar; CREATE TEMPORARY FUNCTION desensitize_phone AS 'com.byteDance.hive.udf.PhoneDesensitize'; SELECT desensitize_phone(phone) FROM user_info;

    • UDAF(用户自定义聚合函数):多进一出(输入多个值,输出一个值),如自定义聚合函数计算中位数。

    • UDTF(用户自定义表生成函数):一进多出(输入一个值,输出多个行 / 列),如自定义函数拆分 JSON 字符串为多列。

    • 字节应用场景:处理特殊格式数据(如 JSON、CSV)、数据脱敏、复杂聚合计算(内置函数无法满足的场景)。

四、Hive性能优化实践🚀

面试考点:Hive 优化的核心思路、SQL 优化技巧、参数优化、数据存储优化(字节重点考察,体现候选人的工程实践能力)

1. 核心优化思路

减少数据扫描量、减少 Shuffle 数据量、提升并行度、避免数据倾斜。

2. SQL优化技巧

  • 严格过滤分区:查询时必须指定分区字段(如 dt),避免全表扫描(字节面试必问,生产环境中未过滤分区的 SQL 会被禁止执行)。

  • 避免 SELECT *:只查询需要的字段(减少数据传输和 IO)。

  • 使用 Where 代替 Having:Where 在 Map 端过滤数据(早过滤,减少后续处理数据量),Having 在 Reduce 端过滤数据(晚过滤,效率低)。

  • 合理使用 Join 顺序:小表在前,大表在后(Hive 会将前面的表作为小表加载到内存,优化 Map Join)。

  • 拆分复杂 SQL:将一个复杂 SQL 拆分为多个简单的中间表(如多表 Join+ 复杂聚合,拆分为多个步骤,便于调试和优化)。

3. 参数优化

  • 并行度优化:

    • 设置 Map 任务数:set mapred.map.tasks=100(根据数据量调整,默认由 Hive 自动计算)。

    • 设置 Reduce 任务数:set mapred.reduce.tasks=50(一般设为 Map 任务数的 1/2~1/3,或根据集群资源调整)。

    • 开启并行执行任务:set hive.exec.parallel=true(允许同时执行多个独立的 MapReduce 任务)。

  • Shuffle 优化:

    • 开启 Map 端聚合:set hive.map.aggr=true

    • 设置 Shuffle 缓冲区大小:set mapreduce.reduce.shuffle.input.buffer.percent=0.7(Reduce 端 Shuffle 输入缓冲区占比,默认 0.7)。

  • 数据倾斜优化:

    • 开启倾斜数据自动处理:set hive.optimize.skewjoin=true(Join 倾斜)、set hive.optimize.skewgroupby=true(Group By 倾斜)。

    • 设置倾斜阈值:set hive.skewjoin.key=100000(当某一 Key 的数量超过 10 万时,认为是倾斜 Key)。

4. 数据存储优化

  • 选择合适的文件格式:

    • Parquet/Orc(字节首选):列式存储,支持压缩(Snappy/Gzip),查询时只读取需要的列,减少 IO;压缩率高,节省存储空间。

    • TextFile(默认):行式存储,不支持压缩(或支持简单压缩),查询效率低,适合原始数据存储(ODS 层)。

    • SequenceFile:二进制文件,支持压缩,适合中间结果存储(较少用)。

  • 开启数据压缩:

    • Map 输出压缩:set mapreduce.map.output.compress=true,压缩格式 Snappy(set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec)。

    • Reduce 输出压缩:set mapreduce.output.fileoutputformat.compress=true,压缩格式 Snappy/Orc(根据存储格式选择)。

  • 合并小文件:

    • Map 任务输出合并:set hive.merge.mapfiles=true

    • Reduce 任务输出合并:set hive.merge.mapredfiles=true

    • 设置合并文件大小阈值:set hive.merge.size.per.task=256000000(合并后文件大小 256MB)。

五、Hive常见问题与解决方案❌

1. 数据倾斜问题(字节高频考察)

问题表现:某一个或几个 Reduce Task 执行时间过长(远超其他 Task),甚至超时失败;整个作业的执行时间由最慢的 Reduce Task 决定。

常见原因: Join 倾斜:某一 Key 的匹配数据量过大(如热点用户的订单数据)。Group By 倾斜:某一 Key 的聚合数据量过大(如某一地区的用户数量远超其他地区)。NULL 值倾斜:Join/Group By 时,大量 NULL 值集中在一个 Reduce Task(NULL 值的哈希值相同)。

解决方案: Join 倾斜解决: 拆分倾斜 Key:将倾斜 Key 单独处理(如热点用户 ID),先过滤出倾斜 Key 的数据进行单独 Join,再与非倾斜数据合并。随机前缀法:对倾斜 Key 加上随机前缀(如concat(key, '_', rand())),将倾斜 Key 分散到多个 Reduce Task,Join 后再去掉前缀。使用 Map Join:如果小表倾斜,将小表加载到内存,Map 端完成 Join(避免 Shuffle)。Group By 倾斜解决: Map 端聚合优化:开启hive.map.aggr=true,增加 Map 端聚合阈值。随机前缀法:对倾斜 Key 加上随机前缀,先局部聚合,再全局聚合。NULL 值倾斜解决: 过滤 NULL 值:如果 NULL 值不需要参与计算,直接用 Where 过滤。NULL 值随机分布:对 NULL 值替换为随机数(如case when key is null then rand() else key end),分散到多个 Reduce Task。

2. 小文件问题

问题表现:HDFS 上存在大量小文件(小于 128MB),导致 NameNode 内存压力大(每个小文件占用 150 字节左右的元数据),查询时 Map 任务数过多(每个小文件对应一个 Map Task),并行度过高导致集群资源竞争。

解决方案: 合并小文件:开启 Hive 的小文件合并参数(如hive.merge.mapfiles=true)。控制文件生成数量:写数据时,通过distribute by + sort by 控制文件数量(如distribute by cast(rand()*10 as int),生成 10 个文件)。使用合适的存储格式:Parquet/Orc 格式支持压缩,可减少文件数量。定期清理小文件:通过 Hadoop 命令(hadoop fs -getmerge)合并小文件,或使用定时任务清理过期小文件。

六、总结📝

字节跳动数据开发岗对 Hive 的考察重点集中在「核心特性(视图、分桶、分区)、SQL 实操与优化、性能问题解决(数据倾斜、小文件)」三大模块,需重点掌握:

  • 视图的作用、限制与生产应用场景;

  • 分桶表的原理、与分区表的区别、SMB Join 优化;

  • SQL 优化技巧(过滤分区、Map Join、开窗函数);

  • 数据倾斜和小文件问题的解决方案(体现工程实践能力)。

备考时需结合实际业务场景理解知识点,多练习复杂 SQL 编写与优化,掌握 Hive 参数的实际配置与效果,才能在面试中脱颖而出。

评论交流