本文是大数据系列第 13 篇,系统介绍 Hive 的 DDL 和 DML 操作,包括数据库管理、内部表与外部表创建、数据加载与查询等核心操作。
启动 Hive
hive # 进入交互式 CLI
# 或
hiveserver2 # 启动 HiveServer2 服务(供 JDBC 连接)
DDL — 数据库操作
创建数据库
-- 默认路径:/user/hive/warehouse/mydb.db
CREATE DATABASE IF NOT EXISTS mydb;
-- 指定 HDFS 存储路径
CREATE DATABASE IF NOT EXISTS mydb
LOCATION '/user/custom/mydb';
切换与查看数据库
USE mydb;
SHOW DATABASES;
DESCRIBE DATABASE mydb;
删除数据库
-- 仅删除空数据库
DROP DATABASE mydb;
-- 级联删除(含所有表)
DROP DATABASE mydb CASCADE;
DDL — 表操作
内部表(Managed Table)
数据由 Hive 管理,DROP TABLE 时数据和元数据一并删除:
CREATE TABLE IF NOT EXISTS emp (
id INT,
name STRING,
salary FLOAT,
dept STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
外部表(External Table)
数据存储在 Hive 之外,DROP TABLE 只删除元数据,HDFS 数据保留:
CREATE EXTERNAL TABLE IF NOT EXISTS emp_ext (
id INT,
name STRING,
salary FLOAT,
dept STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '/user/hadoop/empdata';
使用建议:生产环境优先使用外部表,防止误删数据。
内部表 vs 外部表
| 特性 | 内部表 | 外部表 |
|---|---|---|
| 数据管理 | Hive 负责 | 用户负责 |
| DROP 行为 | 删除数据 + 元数据 | 仅删除元数据 |
| 数据位置 | warehouse 目录 | 自定义 LOCATION |
| 适用场景 | 临时表、中间结果 | 生产数据、共享数据 |
查看与修改表
SHOW TABLES;
DESCRIBE emp; -- 查看列信息
DESCRIBE FORMATTED emp; -- 查看详细信息(含存储格式、HDFS 路径)
-- 重命名
ALTER TABLE emp RENAME TO employee;
-- 添加列
ALTER TABLE emp ADD COLUMNS (email STRING);
删除表
DROP TABLE IF EXISTS emp;
TRUNCATE TABLE emp; -- 仅清空数据,保留表结构(仅限内部表)
DML — 数据操作
加载本地文件
-- 从本地文件系统加载(MOVE,不删除原文件)
LOAD DATA LOCAL INPATH '/home/hadoop/emp.csv' INTO TABLE emp;
-- 覆盖加载
LOAD DATA LOCAL INPATH '/home/hadoop/emp.csv' OVERWRITE INTO TABLE emp;
从 HDFS 加载
-- 从 HDFS 加载(MOVE,原 HDFS 文件被移动)
LOAD DATA INPATH '/user/hadoop/emp.csv' INTO TABLE emp;
INSERT 插入
-- 单条记录
INSERT INTO TABLE emp VALUES (1, 'Tom', 5000.0, 'Engineering');
-- 从查询结果插入
INSERT INTO TABLE emp_high_salary
SELECT * FROM emp WHERE salary > 8000;
-- 覆盖写入
INSERT OVERWRITE TABLE emp_copy
SELECT * FROM emp;
多目标插入(一次扫描,多次写入)
FROM emp
INSERT INTO TABLE high_salary SELECT * WHERE salary > 8000
INSERT INTO TABLE low_salary SELECT * WHERE salary <= 8000;
这种写法只需扫描源表一次,显著减少 MapReduce 任务数。
CTAS(建表同时写入数据)
CREATE TABLE emp_copy AS SELECT * FROM emp;
DQL — 查询操作
-- 基础查询
SELECT id, name, salary FROM emp WHERE dept = 'Engineering';
-- 排序与分页
SELECT * FROM emp ORDER BY salary DESC LIMIT 10;
-- 聚合统计
SELECT dept,
COUNT(*) AS cnt,
AVG(salary) AS avg_sal,
MAX(salary) AS max_sal
FROM emp
GROUP BY dept
HAVING COUNT(*) > 3;
-- JOIN 查询
SELECT a.name, b.dept_name
FROM emp a
JOIN dept b ON a.dept = b.dept_id;
Hive 实用命令
-- 在 Hive CLI 中执行 Shell 命令
!ls /home/hadoop;
!clear;
-- 在 Hive CLI 中执行 HDFS 命令
dfs -ls /user/hive/warehouse;
dfs -mkdir /user/test;
-- 查看内置函数列表
SHOW FUNCTIONS;
-- 查看函数用法
DESCRIBE FUNCTION substr;
hive-site.xml 常用配置
<!-- 小数据集使用本地模式,跳过 YARN 提交,加快调试 -->
<property>
<name>hive.exec.mode.local.auto</name>
<value>true</value>
</property>
<!-- CLI 提示符显示当前数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 查询结果显示列名 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
开启本地模式后,针对小数据集的查询会直接在客户端 JVM 中运行,无需提交 YARN 任务,查询速度大幅提升,适合开发调试阶段。