Hive 数据库 零基础入门详解
Hive 是基于 Hadoop 的数据仓库工具,它将结构化的数据文件映射成数据库和表 ,并提供类 SQL(HiveQL/HQL)的查询接口,让不懂 MapReduce 的用户也能通过 SQL 分析 HDFS 上的海量数据。简单来说:Hive = SQL 解析引擎 + Hadoop 存储 / 计算。
一、核心概念(新手必懂)
1. 基本架构
表格
| 组件 | 作用 |
|---|---|
| 用户接口 | CLI(命令行)、Beeline、Hue、JDBC/ODBC(程序调用) |
| 解析器 / 编译器 | 将 HQL 解析成抽象语法树,编译优化后生成 MapReduce/Spark 任务 |
| 元数据存储 | 默认 Derby(单用户),生产用 MySQL(多用户共享),存储库 / 表 / 字段等信息 |
| 执行引擎 | 提交任务到 Hadoop(MapReduce)/Spark/Tez 执行 |
| 存储层 | 数据默认存在 HDFS,也支持 S3 / 本地文件系统 |
2. 核心对象
- 数据库(Database):类似 MySQL 的库,用于隔离表(默认库:default)。
- 表(Table) :映射 HDFS 上的目录 / 文件,分为:
- 管理表(内部表):Hive 管理数据,删表会删除 HDFS 数据;
- 外部表(External Table):仅管理元数据,删表不删 HDFS 数据(生产常用);
- 分区表 / 分桶表:优化查询性能(按字段分区 / 哈希分桶)。
- 视图(View):虚拟表,基于查询结果创建,不存储数据。
二、常用操作(实战代码)
前置条件
- 已安装 Hadoop 集群并启动(HDFS+YARN);
- 已安装 Hive 并配置元数据(MySQL);
- 启动 Hive:
hive(CLI)或beeline -u jdbc:hive2://localhost:10000(推荐)。
1. 数据库操作
sql
-- 1. 创建数据库(指定存储路径,避免默认路径)
CREATE DATABASE IF NOT EXISTS mydb
LOCATION '/user/hive/warehouse/mydb.db';
-- 2. 查看所有数据库
SHOW DATABASES;
-- 3. 切换数据库
USE mydb;
-- 4. 查看数据库信息
DESCRIBE DATABASE mydb;
-- 5. 删除空数据库(非空需加CASCADE)
DROP DATABASE IF EXISTS mydb CASCADE;
2. 表操作(核心)
(1)创建外部表(生产常用)
sql
-- 创建分区表(按日期dt分区)
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.user_info (
id INT COMMENT '用户ID',
name STRING COMMENT '用户名',
age INT COMMENT '年龄',
gender STRING COMMENT '性别'
)
COMMENT '用户信息表'
PARTITIONED BY (dt STRING COMMENT '数据日期') -- 分区字段
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t' -- 字段分隔符(常用\t、,)
STORED AS TEXTFILE -- 存储格式(TEXTFILE/ORC/Parquet)
LOCATION '/user/hive/warehouse/mydb.db/user_info'; -- 表在HDFS的路径
(2)数据操作
sql
-- 1. 加载本地数据到分区表(dt=20240101)
LOAD DATA LOCAL INPATH '/root/data/user_20240101.txt'
OVERWRITE INTO TABLE mydb.user_info
PARTITION (dt='20240101');
-- 2. 查询数据(类MySQL)
SELECT id, name, age
FROM mydb.user_info
WHERE dt='20240101' AND age > 20;
-- 3. 插入数据(分区dt=20240102)
INSERT INTO TABLE mydb.user_info PARTITION (dt='20240102')
SELECT id, name, age, gender FROM mydb.tmp_user WHERE dt='20240102';
-- 4. 删除分区
ALTER TABLE mydb.user_info DROP PARTITION (dt='20240101');
(3)表管理
sql
-- 查看表结构
DESCRIBE EXTENDED mydb.user_info;
-- 修改表名
ALTER TABLE mydb.user_info RENAME TO mydb.user_info_new;
-- 删除表(外部表仅删元数据,HDFS数据保留)
DROP TABLE IF EXISTS mydb.user_info;
三、关键特性(新手避坑)
- 不是实时数据库:Hive 适合离线批处理(分钟 / 小时级),不支持高并发、低延迟的 OLTP 场景(如 MySQL);
- 存储与计算分离:数据存在 HDFS,计算依赖 Hadoop/Spark,Hive 仅做 SQL 解析;
- 数据格式 :
- 基础:TEXTFILE(易读但压缩率低);
- 优化:ORC/Parquet(列式存储,压缩率高、查询快,生产首选);
- 分区 / 分桶优化 :
- 分区:按时间 / 地域等维度拆分数据(如按天分区),查询时只扫描指定分区,减少数据量;
- 分桶:按字段哈希分桶(如 id%100),适合抽样、JOIN 优化。
总结
- 核心定位:Hive 是 Hadoop 生态的 SQL 解析工具,用于离线分析海量结构化数据,非实时数据库;
- 核心操作:库表创建(优先外部表)、分区管理、数据加载 / 查询,语法接近 MySQL 但需关注 HDFS 路径和存储格式;
- 性能优化:生产中优先用 ORC/Parquet 格式 + 分区 / 分桶,元数据存储用 MySQL 替代 Derby。