Hive
问题
什么是 Hive?它和传统数据库有什么区别?
答案
Hive 简介
Hive 是基于 Hadoop 的 SQL 查询引擎,将 SQL 翻译为 MapReduce/Tez/Spark 任务在分布式集群上执行。
| 对比 | Hive | MySQL |
|---|---|---|
| 数据规模 | TB~PB | GB~TB |
| 延迟 | 分钟~小时 | 毫秒~秒 |
| 存储 | HDFS | 本地磁盘 |
| 事务 | 有限支持 | 完整 ACID |
| 适用 | 离线分析 | 在线业务 |
分区与分桶
-- 分区:按日期分目录存储,查询只扫描对应分区
CREATE TABLE dwd.user_action (
user_id BIGINT,
event STRING,
amount DECIMAL(18,2)
)
PARTITIONED BY (dt STRING, hour STRING)
STORED AS ORC; -- ORC 列存格式
-- 查询时指定分区,避免全表扫描
SELECT * FROM dwd.user_action
WHERE dt = '2024-01-15' AND hour = '10';
-- 分桶:按字段 Hash 分文件,加速 JOIN 和采样
CREATE TABLE dim.users (
user_id BIGINT,
username STRING
)
CLUSTERED BY (user_id) INTO 64 BUCKETS
STORED AS ORC;
文件格式对比
| 格式 | 类型 | 压缩 | 适用 |
|---|---|---|---|
| ORC | 列存 | 高 | Hive 首选 |
| Parquet | 列存 | 高 | Spark/Presto 首选 |
| Avro | 行存 | 中 | 流式写入 |
| Text/CSV | 行存 | 低 | 临时导入 |
数据分析师需要知道的
- 写 SQL 时务必加分区过滤(不加
WHERE dt = ...可能扫描全量数据) - 使用 ORC/Parquet 格式比 Text 快 10x+
- Hive 适合大规模离线 ETL,不适合交互式分析
常见面试问题
Q1: Hive 的内部表和外部表有什么区别?
答案:
- 内部表:DROP 时删除数据和元数据
- 外部表:DROP 时只删除元数据,HDFS 数据保留
- 实践中外部表更安全,防止误删数据
Q2: Hive 查询慢怎么优化?
答案:
- 加分区过滤(最重要)
- 使用 ORC/Parquet 列存格式
- 避免
SELECT *,只查需要的列 - 大表 JOIN 小表用 MapJoin
- 使用 Tez/Spark 引擎替代 MapReduce