以下为 Hive 命令大全及详解,涵盖常用 DDL、DML、查询、配置与运维命令,结合核心概念说明,便于快速查阅与实践:
一、Hive 基础概念
- 本质:基于 Hadoop 的数据仓库工具,将 SQL 转换为 MapReduce/Spark/Tez 任务。
- 核心组件:
- 元数据库(Metastore):存储表结构(MySQL/PostgreSQL等)。
- HiveQL:类 SQL 查询语言。
- 执行引擎:默认 MapReduce,可切换 Spark/Tez。
- 表类型:
- 托管表(Managed Table):数据由 Hive 管理,删除表时数据一并删除。
- 外部表(External Table):数据存于 HDFS 指定路径,删除表仅删元数据。
二、Hive 环境与连接命令
命令 | 说明 |
---|---|
hive | 进入旧版 CLI(已淘汰) |
beeline -u jdbc:hive2://<host>:<port> | 连接 HiveServer2(推荐) |
!connect jdbc:hive2://localhost:10000 | 在 Beeline 内连接 |
!quit 或 !exit | 退出 Beeline |
三、数据库操作(DDL)
-- 创建数据库
CREATE DATABASE IF NOT EXISTS mydb
COMMENT '测试数据库'
LOCATION '/user/hive/mydb'; -- 指定 HDFS 路径
-- 切换数据库
USE mydb;
-- 查看数据库
SHOW DATABASES LIKE 'my*'; -- 模糊匹配
-- 删除数据库
DROP DATABASE IF EXISTS mydb CASCADE; -- 强制删除库及表
四、表操作(DDL)
1. 创建表
-- 托管表
CREATE TABLE employees (
id INT COMMENT '员工ID',
name STRING,
salary FLOAT,
hire_date DATE
)
COMMENT '员工信息表'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',' -- 列分隔符
STORED AS TEXTFILE; -- 存储格式(ORC/PARQUET 更高效)
-- 外部表(数据保留在 HDFS)
CREATE EXTERNAL TABLE logs (
log_time TIMESTAMP,
message STRING
)
LOCATION '/data/logs'; -- 指定外部数据路径
-- 分区表(按日期分区)
CREATE TABLE sales (
order_id BIGINT,
product STRING
)
PARTITIONED BY (dt STRING); -- 分区字段
-- 分桶表(哈希分桶)
CREATE TABLE user_behavior (
user_id BIGINT,
action STRING
)
CLUSTERED BY (user_id) INTO 4 BUCKETS; -- 分4桶
2. 修改表
-- 添加分区
ALTER TABLE sales ADD PARTITION (dt='2023-10-01');
-- 重命名表
ALTER TABLE old_name RENAME TO new_name;
-- 修改列
ALTER TABLE employees CHANGE COLUMN salary salary DOUBLE;
-- 添加列
ALTER TABLE employees ADD COLUMNS (dept STRING COMMENT '部门');
3. 删除表
DROP TABLE IF EXISTS employees; -- 托管表删除数据
DROP TABLE logs; -- 外部表仅删元数据
五、数据操作(DML)
1. 加载数据
-- 从本地加载(复制)
LOAD DATA LOCAL INPATH '/home/user/data.csv'
INTO TABLE employees;
-- 从 HDFS 加载(移动)
LOAD DATA INPATH '/input/data.csv'
OVERWRITE INTO TABLE employees; -- 覆盖写入
-- 插入数据(推荐 INSERT + SELECT)
INSERT OVERWRITE TABLE sales PARTITION (dt='2023-10-01')
SELECT order_id, product FROM raw_orders;
2. 数据导出
-- 导出到 HDFS
INSERT OVERWRITE DIRECTORY '/output/sales'
SELECT * FROM sales;
-- 导出到本地(需 HiveServer2 配置)
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/export'
SELECT * FROM employees;
六、查询命令(DQL)
1. 基础查询
-- 分区剪裁
SELECT * FROM sales WHERE dt = '2023-10-01';
-- 分桶查询
SELECT * FROM user_behavior
TABLESAMPLE(BUCKET 1 OUT OF 4 ON user_id); -- 抽样第1桶
-- 聚合与窗口函数
SELECT
dept,
AVG(salary) AS avg_salary,
RANK() OVER (ORDER BY salary DESC) AS rank
FROM employees
GROUP BY dept;
2. 复杂查询
-- JOIN 操作
SELECT e.name, d.dept_name
FROM employees e
JOIN departments d ON e.dept_id = d.id;
-- 子查询
SELECT name
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
七、Hive 优化关键命令
1. 执行引擎设置
-- 切换引擎(默认为 mr)
SET hive.execution.engine=tez; -- 或 spark
-- 启用向量化查询(ORC/Parquet)
SET hive.vectorized.execution.enabled=true;
2. 动态分区
SET hive.exec.dynamic.partition=true; -- 启用动态分区
SET hive.exec.dynamic.partition.mode=nonstrict; -- 允许所有字段动态分区
INSERT INTO sales PARTITION (dt)
SELECT order_id, product, order_date AS dt
FROM raw_orders;
3. 压缩与存储优化
-- 启用中间数据压缩
SET hive.exec.compress.intermediate=true;
SET mapred.map.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
-- ORC 表压缩
CREATE TABLE orc_table (...)
STORED AS ORC
TBLPROPERTIES ("orc.compress"="SNAPPY");
八、元数据查看与描述
-- 查看表结构
DESCRIBE FORMATTED employees; -- 详细信息(分区/存储格式)
SHOW PARTITIONS sales; -- 显示所有分区
-- 查看建表语句
SHOW CREATE TABLE employees;
-- 函数操作
SHOW FUNCTIONS LIKE 'coalesce*'; -- 查找函数
DESCRIBE FUNCTION EXTENDED upper; -- 函数用法说明
九、权限管理
-- 授权(需启用 Sentry/Ranger)
GRANT SELECT ON TABLE employees TO USER alice;
REVOKE ALL ON DATABASE mydb FROM USER bob;
十、运维与配置
1. Hive 参数设置
-- 临时设置(会话级)
SET hive.map.aggr=true; -- Map 端聚合
SET hive.auto.convert.join=true; -- 自动 MapJoin
-- 永久配置(hive-site.xml)
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value> -- 避免小查询触发 MR
</property>
2. 资源队列(YARN)
SET mapred.job.queue.name=prod; -- 指定 YARN 队列
3. 日志与调试
# 查看 Hive 日志位置(默认)
/var/log/hive/hive.log
# 在 Beeline 中查看执行计划
EXPLAIN FORMATTED
SELECT count(*) FROM sales;
十一、Hive 高级特性
1. ACID 事务(Hive 3+)
-- 启用事务表
CREATE TABLE acid_table (...)
STORED AS ORC
TBLPROPERTIES ('transactional'='true');
-- 更新/删除数据
UPDATE acid_table SET col=1 WHERE id=100;
DELETE FROM acid_table WHERE id=200;
2. 物化视图
CREATE MATERIALIZED VIEW mv_sales
AS
SELECT dt, SUM(amount)
FROM sales
GROUP BY dt;
附:常用技巧与避坑指南
- 避免小文件:
- 合并输出文件:
SET hive.merge.mapfiles=true;
- 定期执行:
ALTER TABLE sales CONCATENATE;
(ORC表)
- 合并输出文件:
- 数据倾斜处理:
SET hive.groupby.skewindata=true; -- 分组倾斜优化 SET hive.optimize.skewjoin=true; -- JOIN 倾斜优化
- 使用分析函数替代 UDF:
PERCENTILE_APPROX()
比自定义分位数 UDF 更高效。 - 外部表恢复:
误删外部表后重建表并指定原路径即可恢复数据。
注意:生产环境优先使用
Beeline + HiveServer2
,避免直接操作 HDFS 路径。
掌握以上命令可覆盖 90% 的 Hive 使用场景。建议结合存储格式(ORC/Parquet)、分区/分桶策略和计算引擎(Tez/Spark)进行深度优化。