Hive 实战
Hive 概述
Hive 是基于 Hadoop 的数据仓库工具,将 SQL(HiveQL) 转换为 MapReduce / Spark / Tez 任务执行,适合 PB 级离线数据分析。
核心作用
- 将结构化数据文件映射为数据库表
- 提供类 SQL 查询语言(HiveQL)操作大规模数据
- 底层依赖 HDFS 存储
Hive vs 关系型数据库
| 特性 |
Hive |
MySQL |
| 场景 |
离线分析(OLAP) |
事务处理(OLTP) |
| 数据规模 |
PB 级 |
GB 级 |
| 延迟 |
高(秒~分钟) |
低(毫秒) |
| 更新 |
支持但效率低 |
高效支持 |
| 索引 |
有限 |
完善 |
存储格式
| 格式 |
特点 |
TEXTFILE |
明文,可直接查看 |
ORC |
列式存储,压缩率高(推荐) |
Parquet |
列式,跨语言兼容好 |
Avro |
行式,支持 schema 演进 |
环境架构
HiveServer2 / Beeline / Hue
↓
Hive 核心服务
↓
执行引擎(MapReduce / Spark / Tez)
↓
HDFS / HBase
Hive 数据模型
-- 内部表(Managed Table):数据由 Hive 管理,删除表时数据也删除
CREATE TABLE tb_emp (
empno INT,
ename STRING,
job STRING,
sal DECIMAL(7,2)
) STORED AS ORC;
-- 外部表(External Table):数据由外部管理,删除表时数据保留
CREATE EXTERNAL TABLE tb_emp_ext (
empno INT,
ename STRING
) LOCATION '/data/emp/';
-- 分区表(Partitioned Table):按分区字段划分目录
CREATE TABLE tb_sales (
amount DECIMAL(10,2),
dt STRING
) PARTITIONED BY (year STRING, month STRING);
-- 分桶表(Bucketed Table):按哈希分桶
CREATE TABLE tb_emp_bkt (
empno INT, ename STRING
) CLUSTERED BY (empno) INTO 4 BUCKETS;
HiveQL 常用操作
DDL
CREATE DATABASE IF NOT EXISTS warehouse; -- 建库
SHOW DATABASES; -- 查库
USE warehouse; -- 切换库
SHOW TABLES; -- 查表
DROP TABLE tb_emp; -- 删表
TRUNCATE TABLE tb_emp; -- 清空数据(Hive 3.0+)
DML
-- 加载数据(从 HDFS 或本地)
LOAD DATA INPATH '/data/emp.csv' INTO TABLE tb_emp;
LOAD DATA LOCAL INPATH '/local/emp.csv' INTO TABLE tb_emp;
-- 查询(与 SQL 基本一致)
SELECT ename, sal FROM tb_emp WHERE sal > 3000;
-- 聚合
SELECT deptno, COUNT(*), AVG(sal)
FROM tb_emp
GROUP BY deptno;
-- 高级函数(Hive 支持更多函数)
SELECT row_number() OVER (PARTITION BY deptno ORDER BY sal DESC) rn,
ename, sal
FROM tb_emp;
常用函数
| 函数 |
说明 |
row_number / rank / dense_rank |
窗口排名 |
collect_set / collect_list |
分组收集 |
explode |
炸裂数组/Map |
concat_ws / split |
字符串操作 |
unix_timestamp / from_unixtime |
时间戳转换 |
json_tuple / get_json_object |
JSON 解析 |
Python 操作 Hive(PyHive)
from pyhive import hive
conn = hive.connect(host='localhost', port=10000,
username='hive')
cursor = conn.cursor()
cursor.execute('SELECT * FROM tb_emp WHERE sal > 3000')
for row in cursor.fetchall():
print(row)
conn.close()
总结
- Hive = SQL 解析层 + 执行引擎(MR/Spark/Tez) + 存储层(HDFS)
- 外部表:数据不归 Hive 管;内部表:数据由 Hive 管理
- 分区:按字段划分子目录,提升查询效率
- 分桶:按哈希划分,减少 JOIN 时的数据倾斜
- 存储格式推荐 ORC 或 Parquet