目录
Hive 核心知识(含与 MySQL 详细区别)
一、Hive 核心基础概念
- 什么是 Hive:Hive 是基于 Hadoop 的数据仓库工具,本质是将 HQL(Hive SQL)转换为 MapReduce/Spark/Tez 分布式计算任务,实现对 HDFS 上大规模结构化数据的查询、分析和统计。
- 注意:Hive 不是传统关系型数据库(无事务、无实时查询、不支持行级更新/删除),适合离线批量处理(如每日/每月的大数据报表统计、ETL 数据清洗)。
- 核心价值:让熟悉 SQL 的开发/分析师无需编写 MapReduce 代码,即可操作 HDFS 上的海量数据,降低大数据处理门槛。
- Hive 核心特点
- 存储:数据存储在 HDFS 上,Hive 自身不存储数据,仅存储元数据(表结构、字段类型、数据存储路径等),元数据默认存在 Derby 数据库,生产环境常用 MySQL 存储元数据。
- 计算:底层依赖分布式计算引擎(早期 MapReduce,现在主流 Spark/Tez,性能更优)。
- 语法:支持类 SQL 语法(HQL),与 ANSI SQL 高度兼容,但存在部分特有语法(如分区、分桶)。
- 适用场景:离线、批量、海量结构化数据的分析处理(不支持实时查询,延迟通常为分钟/小时级)。
- Hive 与传统 MySQL 核心区别(重点新增)
这是两者最核心的差异,也是避免使用误区的关键,具体对比如下:对比维度 Hive MySQL 核心定位 数据仓库工具(离线分析、报表统计) 关系型数据库(在线交易、实时查询) 存储介质 HDFS(分布式文件系统,支持海量存储) 本地磁盘/存储阵列(单机/小规模集群,存储容量有限) 计算引擎 MapReduce/Spark/Tez(分布式计算,处理海量数据) 自身查询优化器(单机/小规模集群计算,处理中小量数据) 事务支持 弱支持(仅开启 ACID 配置后,有限支持行级事务) 强支持(完整 ACID 事务,支持事务提交、回滚) 实时性 极低(离线批量处理,延迟分钟/小时级) 极高(实时查询/更新,延迟毫秒/秒级) 数据更新 默认不支持行级增删改(仅支持全表/分区覆盖) 完美支持行级增删改查(CRUD 操作) 适用数据量 海量数据(TB/PB 级,甚至 EB 级) 中小量数据(GB/TB 级,超 TB 级性能大幅下降) 表类型特色 支持外部表、分区表、分桶表(优化海量数据查询) 支持普通表、索引表、视图(优化小数据量查询) 数据格式 支持 TextFile、ORC、Parquet 等(列式/行式存储) 默认行式存储,支持多种存储引擎(InnoDB/MyISAM 等) 部署与运维 依赖 Hadoop 生态,部署复杂,运维成本高 独立部署,配置简单,运维成本低
二、Hive 核心架构(极简版)
Hive 架构分为 3 个核心部分,各司其职:
- 用户接口层:用户与 Hive 交互的入口,常用 3 种方式
- CLI(命令行界面):最常用,直接输入
hive命令进入交互模式,执行 HQL 语句。 - Beeline:新一代 CLI 工具,基于 JDBC 连接,性能更优,生产环境推荐使用。
- Web UI(Hue 等):可视化界面,适合非技术人员(如数据分析师)操作。
- CLI(命令行界面):最常用,直接输入
- 核心处理层:Hive 的大脑,负责解析、优化、生成执行计划
- 解析器(Parser):将 HQL 语句解析为抽象语法树(AST)。
- 优化器(Optimizer):对抽象语法树进行优化(如调整执行顺序、合并操作),生成最优执行计划。
- 执行器(Executor):将优化后的执行计划转换为 MapReduce/Spark 任务,提交给 Hadoop/Spark 集群执行。
- 存储层:负责数据和元数据的存储
- 元数据存储(Metastore):存储表结构、分区信息、数据路径等,生产环境常用 MySQL 存储(避免 Derby 单会话限制)。
- 数据存储:原始数据存储在 HDFS 上,Hive 支持多种数据格式(TextFile、Parquet、ORC 等,其中 Parquet/ORC 为列式存储,查询性能更优,生产环境首选)。
三、Hive 常用核心语法(高频)
Hive 语法与 SQL 高度相似,核心差异在于表的创建(分区、分桶、数据格式),以下是企业开发中最常用的语法:
1. 基础环境操作
-- 1. 查看当前数据库
SELECT current_database();
-- 2. 创建数据库(if not exists 避免重复创建报错)
CREATE DATABASE IF NOT EXISTS hive_demo;
-- 3. 切换数据库
USE hive_demo;
-- 4. 删除数据库(cascade 级联删除库下所有表,否则库非空时无法删除)
DROP DATABASE IF EXISTS hive_demo CASCADE;
2. 表的创建(核心:内部表、外部表、分区表)
Hive 表的核心分类:内部表(管理表)、外部表、分区表、分桶表,其中外部表和分区表在生产环境中使用频率最高。
(1)外部表(生产首选)
- 特点:数据存储在 HDFS 指定路径,删除表时仅删除元数据,不删除 HDFS 上的原始数据,数据安全性更高(避免误删表导致数据丢失),适合多工具共享数据(如 Hive、Spark 共用 HDFS 数据)。
- 语法:创建时加
EXTERNAL关键字,指定LOCATION(HDFS 数据存储路径)。
-- 创建外部表(用户表,列式存储 ORC 格式,支持分区)
CREATE EXTERNAL TABLE IF NOT EXISTS user_info (
id INT COMMENT '用户ID',
name STRING COMMENT '用户姓名',
age INT COMMENT '用户年龄',
register_time STRING COMMENT '注册时间'
)
COMMENT '用户信息表'
PARTITIONED BY (dt STRING COMMENT '数据日期,格式:yyyy-MM-dd') -- 按日期分区
STORED AS ORC -- 数据存储格式(ORC,生产首选,查询性能优)
LOCATION '/hive/demo/user_info' -- HDFS 数据存储路径
TBLPROPERTIES (
'orc.compress'='SNAPPY', -- ORC 压缩格式(SNAPPY,兼顾性能和压缩比)
'comment'='用户信息外部表,按日期分区'
);
(2)内部表(管理表)
- 特点:数据默认存储在 Hive 仓库目录(
/user/hive/warehouse),删除表时同时删除元数据和 HDFS 原始数据,数据安全性低,适合临时表、中间结果表。 - 语法:创建时不加
EXTERNAL关键字。
-- 创建内部表(临时中间表)
CREATE TABLE IF NOT EXISTS user_info_temp (
id INT,
name STRING,
age INT
)
COMMENT '用户信息临时表'
STORED AS TEXTFILE; -- 文本格式(默认,查询性能差,仅测试用)
(3)分区表(优化查询性能)
- 特点:将数据按指定字段(如日期、地区)划分成多个分区,查询时可指定分区过滤,避免扫描全表数据,大幅提升查询性能(如仅查询 2026-02-03 的数据,只需扫描该分区)。
- 语法:创建时加
PARTITIONED BY关键字,分区字段不能是表内已存在的字段。 - 常用操作:添加分区、加载分区数据、查询分区数据。
-- 1. 加载数据到指定分区(本地文件加载到 Hive 表 2026-02-03 分区)
LOAD DATA LOCAL INPATH '/local/path/user_info_20260203.csv'
OVERWRITE INTO TABLE user_info
PARTITION (dt='2026-02-03');
-- 2. 添加分区(仅添加元数据,需手动将数据上传到对应 HDFS 路径)
ALTER TABLE user_info ADD PARTITION (dt='2026-02-04') LOCATION '/hive/demo/user_info/dt=2026-02-04';
-- 3. 查询指定分区数据(避免全表扫描,性能优)
SELECT * FROM user_info WHERE dt='2026-02-03' AND age > 25;
3. 数据查询(与 SQL 基本一致)
Hive 支持 SQL 常用的查询语法:SELECT、WHERE、GROUP BY、ORDER BY、JOIN 等,仅部分语法有细微差异(如 LIMIT 必须放在最后)。
-- 1. 基础查询(带过滤、排序)
SELECT id, name, age
FROM user_info
WHERE dt='2026-02-03' AND age >= 18
ORDER BY age DESC
LIMIT 100;
-- 2. 分组聚合(统计各年龄段用户数)
SELECT
CASE WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 30 THEN '青年'
ELSE '中老年' END AS age_group,
COUNT(*) AS user_count
FROM user_info
WHERE dt='2026-02-03'
GROUP BY
CASE WHEN age < 18 THEN '未成年'
WHEN age BETWEEN 18 AND 30 THEN '青年'
ELSE '中老年' END;
-- 3. 多表关联(用户表关联订单表)
SELECT u.id, u.name, o.order_id, o.order_amount
FROM user_info u
LEFT JOIN order_info o ON u.id = o.user_id
WHERE u.dt='2026-02-03' AND o.dt='2026-02-03';
4. 数据写入(插入/导出)
-- 1. 插入数据到分区表(单分区)
INSERT OVERWRITE TABLE user_info PARTITION (dt='2026-02-05')
SELECT id, name, age, register_time FROM user_info_temp;
-- 2. 导出数据到 HDFS 路径
INSERT OVERWRITE DIRECTORY '/hive/demo/export/user_info_20260203'
STORED AS ORC
SELECT * FROM user_info WHERE dt='2026-02-03';
-- 3. 导出数据到本地文件系统
INSERT OVERWRITE LOCAL DIRECTORY '/local/path/export/user_info'
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' -- 字段分隔符为逗号
SELECT * FROM user_info WHERE dt='2026-02-03';
5. 表结构修改与删除
-- 1. 添加字段
ALTER TABLE user_info ADD COLUMNS (gender STRING COMMENT '用户性别');
-- 2. 修改字段类型(仅支持兼容类型修改,如 STRING 改为 VARCHAR)
ALTER TABLE user_info CHANGE COLUMN gender gender VARCHAR(10) COMMENT '用户性别';
-- 3. 删除分区
ALTER TABLE user_info DROP PARTITION (dt='2026-02-01');
-- 4. 删除表
DROP TABLE IF EXISTS user_info_temp;
四、生产环境关键注意事项
- 数据格式选择:优先使用 ORC 或 Parquet(列式存储),相比默认的 TextFile,压缩比更高(节省 HDFS 存储空间)、查询性能更优(仅扫描需要的列)。
- 分区策略:按高频查询字段分区(如日期
dt、地区region),分区粒度不宜过细(避免产生大量小文件)或过粗(无法发挥分区优化效果)。 - 小文件处理:Hive 处理大量小文件(小于 128M,HDFS 块大小)会严重影响性能,可通过
INSERT OVERWRITE合并小文件、设置hive.merge.mapfiles自动合并等方式优化。 - 元数据管理:生产环境必须将元数据存储在 MySQL(而非默认 Derby),支持多会话访问,且便于元数据备份和管理。
- 查询优化:避免
SELECT *(仅查询需要的列)、避免全表扫描(尽量指定分区)、优化JOIN操作(大表放后面,小表放前面,利用 MapJoin 优化)。
总结
- Hive 是基于 Hadoop 的离线数据仓库工具,核心是将 HQL 转换为分布式计算任务,适合 TB/PB 级海量数据的离线分析,与 MySQL 的核心定位和使用场景截然不同。
- Hive 与 MySQL 的核心差异集中在存储/计算引擎、实时性、事务支持、数据量适配,切勿将 Hive 用于实时业务查询,也不要用 MySQL 处理海量离线数据。
- 生产环境首选「外部表+分区表+ORC/Parquet 格式」,保障数据安全且优化查询性能,掌握数据库/表创建、分区数据加载、分组聚合查询即可应对 80% 的日常开发场景。
浙公网安备 33010602011771号