hive简介
Hive是基于Hadoop的数据仓库工具,可将结构化数据文件映射为数据库表,并提供类SQL查询功能(HQL)。其本质是将SQL语句转换为MapReduce任务运行,适合离线批处理场景。
核心概念
- 元数据存储 :通常使用MySQL存储表结构、分区等信息。
- 执行引擎:支持MapReduce、Tez、Spark等计算框架。
- 数据模型:表(Table)、分区(Partition)、桶(Bucket)。
数据库与数据仓库的区别
数据库的设计目标是高效处理事务性操作,如插入、更新和删除数据,(改变数据)确保数据的实时性和一致性。数据仓库的设计目标是支持分析和报告,提供历史数据的聚合视图,便于业务分析和决策。
前者用于实时业务的操作,后者用于离线数据分析和决策。
Hive本身没有计算能力和存储能力。
主要用于查询,管理PB级别的数据
Hive分区的概念
Hive分区是一种将表数据按照特定列的值进行逻辑划分的机制,类似于文件系统中的目录结构。通过分区,可以显著提高查询效率,因为查询时可以只扫描特定分区的数据,而非全表扫描。
Hive分桶的概念
Hive分桶(Bucketing)是一种数据组织技术,通过哈希函数将数据均匀分布到固定数量的桶(文件)中。与分区(Partitioning)按目录划分不同,分桶是在文件级别对数据进行更细粒度的划分。(类似于余数相同的同一个文件夹都是为了加快查询速度)
常用命令示例
-- 创建表(带分区)
CREATE TABLE user_logs (
user_id STRING,
action_time TIMESTAMP,
url STRING
) PARTITIONED BY (dt STRING);
-- 加载数据
LOAD DATA INPATH '/path/to/data' INTO TABLE user_logs PARTITION (dt='2023-01-01');
-- 查询优化(启用本地模式)
SET hive.exec.mode.local.auto=true;
优化技巧
- 分区裁剪:通过WHERE子句过滤分区减少扫描量。
- JOIN优化 :小表放在JOIN左侧(MapJoin自动优化需开启
hive.auto.convert.join=true)。 - 压缩设置 :使用Snappy压缩减少IO(
SET hive.exec.compress.output=true)。
数据类型
- 基本类型:
INT,STRING,BOOLEAN,FLOAT等。 - 复杂类型:
ARRAY<STRING>,MAP<STRING, INT>,STRUCT<name:STRING, age:INT>。
注意事项
- 避免全表扫描,合理设计分区字段。
- 动态分区需启用配置(
SET hive.exec.dynamic.partition.mode=nonstrict)。 - 外部表(EXTERNAL TABLE)删除时仅删除元数据,不删除HDFS数据。
适用场景
适合离线批处理、历史数据分析,不适合低延迟的实时查询。常用于日志分析、报表生成等场景。
与Spark SQL对比
| 特性 | Hive | Spark SQL |
|---|---|---|
| 执行速度 | 较慢(MR) | 快(内存计算) |
| 实时性 | 批处理 | 支持微批 |
| 语法兼容性 | HQL | ANSI SQL更贴近 |
建议通过实际场景练习分区管理、数据倾斜处理等进阶操作。