本文是大数据系列第 13 篇,系统介绍 Hive 的 DDL 和 DML 操作,包括数据库管理、内部表与外部表创建、数据加载与查询等核心操作。

完整图文版(含截图):CSDN 原文 | 掘金

启动 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 任务,查询速度大幅提升,适合开发调试阶段。