Hive SQL完整语法体系与特性解析
一、数据定义语言(DDL)
- 库操作
CREATE DATABASE [IF NOT EXISTS] dbname
[COMMENT '描述']
[LOCATION 'hdfs_path']
[WITH DBPROPERTIES (key=value)];
ALTER DATABASE dbname SET DBPROPERTIES (key=value);
DROP DATABASE [IF EXISTS] dbname [CASCADE];
- 表操作
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] tbname (
列名 数据类型 [COMMENT '注释'],
...
)
[COMMENT '表注释']
[PARTITIONED BY (分区列 数据类型,...)]
[CLUSTERED BY (分桶列) INTO N BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION 'hdfs_path']
[TBLPROPERTIES (key=value)];
-- 示例:创建分区表
CREATE TABLE user_logs (
user_id STRING,
action STRING,
ts BIGINT
)
PARTITIONED BY (dt STRING)
STORED AS ORC;
- 视图操作
CREATE VIEW [IF NOT EXISTS] view_name AS
SELECT ...;
二、数据操作语言(DML)
- 数据加载
LOAD DATA [LOCAL] INPATH 'filepath'
[OVERWRITE] INTO TABLE tbname
[PARTITION (分区列=值,...)];
- 数据插入
INSERT [OVERWRITE|INTO] TABLE tbname
[PARTITION (分区列=值,...)]
SELECT ...;
-- 动态分区插入
SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;
INSERT OVERWRITE TABLE user_logs
PARTITION (dt)
SELECT user_id, action, ts, dt
FROM source_table;
- 数据更新(需事务支持)
UPDATE tbname SET 列=值 WHERE 条件;
DELETE FROM tbname WHERE 条件;
三、查询语言(DQL)
- 基础查询
SELECT [ALL|DISTINCT] 列表达式
FROM tbname
[WHERE 条件]
[GROUP BY 分组列]
[HAVING 过滤条件]
[ORDER BY 排序列]
[CLUSTER BY 列]
[DISTRIBUTE BY 列 SORT BY 列]
[LIMIT N];
- 窗口函数
SELECT
user_id,
RANK() OVER (PARTITION BY dept ORDER BY sales DESC) AS rank
FROM sales_data;
- Lateral View
SELECT user_id, item
FROM orders
LATERAL VIEW explode(items) tmp AS item;
四、数据类型差异
原生类型扩展
- 时间类型:
TIMESTAMP
、DATE
- 二进制类型:
BINARY
- 复杂类型:
ARRAY<数据类型> MAP<primitive_type, data_type> STRUCT<列名:数据类型,...> UNIONTYPE<data_type, data_type,...>
- 时间类型:
类型强制转换
SELECT CAST('123' AS INT);
五、Hive特有功能
- 分区分桶机制
-- 分区管理
ALTER TABLE tbname ADD PARTITION (dt='20230101');
MSCK REPAIR TABLE tbname; -- 自动修复分区
-- 分桶抽样
SELECT * FROM tbname
TABLESAMPLE(BUCKET x OUT OF y ON 分桶列);
- 事务操作(Hive 3+)
CREATE TABLE tx_table (
id INT,
value STRING
)
STORED AS ORC
TBLPROPERTIES (
'transactional'='true',
'transactional_properties'='insert_only'
);
六、与传统SQL核心差异
特性 | HiveQL | 传统SQL |
---|---|---|
执行引擎 | MapReduce/Tez/Spark | 专用查询引擎 |
延迟 | 分钟级 | 毫秒级 |
事务支持 | 有限支持(Hive 3+) | ACID完整支持 |
索引机制 | 有限 | 多种索引类型 |
数据更新 | 批量覆盖/条件删除 | 实时CRUD |
存储结构 | HDFS文件存储 | 专用存储格式 |
执行模式 | 批处理 | 交互式 |
复杂类型 | 支持ARRAY/MAP/STRUCT | 通常不支持 |
UDF扩展 | 支持Java/Python等扩展 | 存储过程/函数扩展 |
七、优化配置实践
-- 设置执行引擎
SET hive.execution.engine=tez;
-- 启用向量化查询
SET hive.vectorized.execution.enabled=true;
-- 合并小文件
SET hive.merge.mapfiles=true;
SET hive.merge.size.per.task=256000000;
-- 启用CBO优化
SET hive.cbo.enable=true;
SET hive.compute.query.using.stats=true;
八、元数据查询
-- 查看表结构
DESCRIBE FORMATTED tbname;
-- 显示分区信息
SHOW PARTITIONS tbname;
-- 查询执行计划
EXPLAIN [EXTENDED|DEPENDENCY|AUTHORIZATION] SELECT ...;
应用建议:
- 大规模数据集优先使用分区+分桶组合
- ORC/Parquet格式比文本格式性能提升50%以上
- 合理设置Map/Reduce任务数避免资源浪费
- 对频繁查询的列建立Bloom Filter索引
- 使用Tez引擎时调整容器内存分配
通过理解这些特性和差异,可以更高效地设计Hive数据仓库架构,充分发挥其在PB级数据处理场景中的优势。