Hive 是什么
Hive 是构建在 Hadoop 之上的数据仓库工具:它把 SQL(HiveQL)编译成分布式作业,交给 MapReduce、Tez 或 Spark 执行,数据本身放在 HDFS 或对象存储上。Hive 自身不做数据存储,只保存表结构、分区、字段类型这类元数据,由 Hive Metastore 统一管理——这也是 Spark SQL、Trino、Flink 能直接读写同一份 Hive 表的原因。它擅长高吞吐的批量扫描,不适合毫秒级点查。
基本信息
| 定位 | SQL 编译层 + 元数据服务 |
|---|---|
| 执行引擎 | MapReduce / Tez / Spark |
| 数据存储 | HDFS、对象存储(S3 / OSS 等) |
| 元数据 | Hive Metastore,通常后端接 MySQL 或 PostgreSQL |
| 常见版本 | Hive 2.x / 3.x / 4.x |
典型使用场景
- 离线数仓 ODS→DWD→DWS 的批量加工,按天跑全量与增量分区
- 大体量历史数据的扫描与聚合,单次查询扫过 TB 级分区
- 充当共享元数据中心,让 Spark、Trino 直接查询同一批表
- 日志、埋点等半结构化数据用外部表加分区挂载,不搬动原文件
切换执行引擎
切换执行引擎
set hive.execution.engine=tez; -- 主流选择,DAG 执行可复用中间结果
set hive.execution.engine=mr; -- 兜底方案,兼容性最好但最慢
set hive.execution.engine=spark; -- Hive on Spark,需额外部署 Spark 环境
-- 常用配套参数
set hive.cbo.enable=true; -- 开启基于代价的优化
set hive.vectorized.execution.enabled=true; -- 向量化执行,扫描型作业提速明显执行引擎对照
| 引擎 | 特点 | 适用场景 |
|---|---|---|
| MapReduce | 调度笨重,中间结果大量落盘 | 稳定性优先、作业量小的兜底场景 |
| Tez | 以 DAG 执行,可复用中间结果 | 多数离线 ETL 的默认选择 |
| Spark | 内存计算,批流 API 统一 | 已有 Spark 集群,需与 Spark 任务统一 |
| Trino / Presto | 非 Hive 引擎,但读 Hive 元数据 | 面向人的交互式即席查询 |
建外部分区表
建外部分区表
-- 外部表:删表不删数据,适合挂载源文件目录
CREATE EXTERNAL TABLE ods_order (
order_id STRING,
user_id STRING,
pay_amt DECIMAL(18,2)
) PARTITIONED BY (dt STRING)
STORED AS ORC
LOCATION '/warehouse/ods/ods_order';
-- 已有分区目录时,就地识别新增分区,不搬数据
MSCK REPAIR TABLE ods_order;分区裁剪是 Hive 最主要的省算力手段:WHERE 里直接写 dt='2026-10-13' 才会裁剪分区;写成 date_format(dt,'yyyyMMdd')='20261013' 这类函数形式会让裁剪失效,作业退化为全表扫描。ORC 列式存储 + 向量化 + CBO 是扫描型作业最常见的提速组合。