Hive 中的表类型可以从多个维度进行划分,主要包括管理方式、数据存储格式、数据生命周期和功能特性。理解这些类型对于正确使用 Hive 至关重要。
一、按管理方式划分(最核心的分类)
这是 Hive 中最基本、最重要的分类方式,决定了 Hive 对数据和元数据的控制权。
1. 内部表(Managed Table / Internal Table)
- 定义:Hive 拥有其完全控制权的表。Hive 负责管理其元数据和数据本身。
- 创建方式:使用
CREATE TABLE(不加EXTERNAL关键字)。 - 存储位置:默认存储在
hive.metastore.warehouse.dir配置的仓库目录下(如/user/hive/warehouse/<database_name>.db/<table_name>)。 - DROP 操作后果:删除元数据的同时,也会删除底层的 HDFS 数据文件。
- 适用场景:
- 数据生命周期由 Hive 全程管理。
- 临时或中间结果表。
- 确信不再需要这些数据时,可以通过删表直接清理存储空间。
示例:
CREATE TABLE managed_employee (
id INT,
name STRING,
dept STRING
)
STORED AS ORC;
-- 数据文件存储在 /user/hive/warehouse/default.db/managed_employee/
-- DROP TABLE managed_employee; 会删除这个目录
2. 外部表(External Table)
- 定义:Hive 仅管理其元数据,而数据文件由外部进程管理和控制。
- 创建方式:使用
CREATE EXTERNAL TABLE,并通常用LOCATION指定数据路径。 - 存储位置:可以存储在 HDFS 的任意位置。
- DROP 操作后果:仅删除元数据(表结构),而不会删除底层的 HDFS 数据文件。
- 适用场景:
- 数据共享:多个计算框架(如 Spark, Presto, Impala)需要读取同一份数据。
- 数据由外部工具产生:数据由 Flume, Sqoop, Spark Job 等工具生成并管理。
- 防止误删:避免因在 Hive 中执行
DROP TABLE而丢失重要数据。
示例:
CREATE EXTERNAL TABLE external_logs (
log_time TIMESTAMP,
message STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LOCATION '/data/logs/app_logs/'; -- 数据已存在于此路径
-- DROP TABLE external_logs; 后,/data/logs/app_logs/ 下的数据依然存在
二、按数据存储格式划分
表的存储格式决定了数据在磁盘上的组织方式,直接影响查询性能和存储效率。
| 类型 | 描述 | 特点 | 适用场景 |
|---|---|---|---|
| 文本表 (TEXTFILE) | STORED AS TEXTFILE | 默认格式,可读性强,存储和查询效率低,无压缩。 | 原始数据加载、简单测试。 |
| 序列文件 (SEQUENCEFILE) | STORED AS SEQUENCEFILE | 二进制 kv 格式,可压缩,支持块压缩,效率优于文本。 | 旧版本优化,现在较少用。 |
| RCFile (Record Columnar) | STORED AS RCFILE | 早期的列式存储,兼具行式和列式的优点。 | 旧版列式存储需求。 |
| ORCFile (Optimized Row Columnar) | STORED AS ORC | 高性能列式存储,支持压缩、索引(如 Bloom Filter)、谓词下推,强烈推荐。 | 大多数 OLAP 分析场景。 |
| Parquet | STORED AS PARQUET | 另一种高性能列式存储,尤其受 Spark 生态青睐,支持嵌套数据结构。 | 与 Spark 交互频繁的场景,复杂数据类型。 |
| Avro | STORED AS AVRO | 基于 schema 的行式存储,支持 schema 演化。 | 需要 schema 演进的数据序列化。 |
示例:
-- 创建ORC格式表
CREATE TABLE orc_table (id INT, name STRING) STORED AS ORC;
-- 创建Parquet格式表
CREATE TABLE parquet_table (id INT, name STRING) STORED AS PARQUET;
三、按数据生命周期划分
1. 永久表(Permanent Table)
- 就是我们通常创建的内部表和外部表。
- 除非手动执行
DROP TABLE,否则表会一直存在。 - 最常见的表类型。
2. 临时表(Temporary Table)
- 定义:仅在当前会话(Session) 期间存在的表。会话结束,表(包括元数据和数据)自动被删除。
- 创建方式:使用
CREATE TEMPORARY TABLE。 - 作用域:仅对创建它的会话可见,其他会话看不到。
- 适用场景:存储会话中间的临时计算结果,避免创建大量无需持久化的表。
示例:
CREATE TEMPORARY TABLE temp_results AS
SELECT dept, AVG(salary) AS avg_sal FROM employees GROUP BY dept;
SELECT * FROM temp_results; -- 只在当前会话有效
-- 会话断开后,temp_results 表自动消失
四、按功能特性划分
1. 分区表(Partitioned Table)
- 根据某一列的值(如
dt,country)将数据在物理上分割到不同的子目录中。 - 优点:分区裁剪,极大提高查询效率,方便数据管理(如按天删除)。
- 创建方式:使用
PARTITIONED BY子句。
示例:
CREATE TABLE log_data (
message STRING
)
PARTITIONED BY (dt STRING, country STRING);
2. 分桶表(Bucketed Table)
- 根据某一列的哈希值,将数据划分到固定数量的文件(桶) 中。
- 优点:提高采样效率、优化 Map-Side Joins(SMB Join)、减少数据倾斜。
- 创建方式:使用
CLUSTERED BY ... INTO ... BUCKETS子句。
示例:
CREATE TABLE user_bucketed (
user_id INT,
name STRING
)
CLUSTERED BY (user_id) INTO 32 BUCKETS;
3. 事务表(ACID Table)
- 定义:支持 ACID(原子性、一致性、隔离性、持久性)事务的表。允许
INSERT,UPDATE,DELETE操作。 - 要求:必须是内部表,存储格式必须为 ORC,并且必须分桶。
- 创建方式:需要设置事务属性
TBLPROPERTIES ('transactional'='true')。
示例:
CREATE TABLE acid_table (
id INT,
value STRING
)
CLUSTERED BY (id) INTO 4 BUCKETS
STORED AS ORC
TBLPROPERTIES ('transactional'='true');
4. 视图(View)
- 一种虚拟表,基于一个或多个基表的查询结果构建。
- 不存储数据,只存储计算逻辑。
- 用于简化复杂查询、隐藏底层数据结构、提供数据安全层(只暴露视图而非基表)。
示例:
CREATE VIEW high_salary_employees AS
SELECT name, salary FROM employees WHERE salary > 100000;
总结对比表
| 分类维度 | 表类型 | 核心特点 | 关键命令/属性 |
|---|---|---|---|
| 管理方式 | 内部表 | Hive 全权管理数据和元数据,删表即删数据 | CREATE TABLE |
| 外部表 | Hive 只管理元数据,数据外部管理,删表不删数据 | CREATE EXTERNAL TABLE ... LOCATION | |
| 存储格式 | ORC/Parquet | 列式存储,高性能,压缩,生产环境首选 | STORED AS ORC/PARQUET |
| TEXTFILE | 文本格式,可读性强,性能差 | STORED AS TEXTFILE | |
| 生命周期 | 永久表 | 持久化存在,直到被手动删除 | CREATE TABLE |
| 临时表 | 仅在当前会话存在,会话结束自动删除 | CREATE TEMPORARY TABLE | |
| 功能特性 | 分区表 | 按目录划分数据,优化查询 | PARTITIONED BY |
| 分桶表 | 按文件划分数据,优化Join和采样 | CLUSTERED BY ... INTO ... BUCKETS | |
| 事务表 | 支持 UPDATE/DELETE/MERGE 操作 | TBLPROPERTIES ('transactional'='true') | |
| 视图 | 虚拟表,不存数据,只存逻辑 | CREATE VIEW ... AS SELECT ... |
在实际应用中,这些类型通常是组合使用的,例如创建一个 ORC 格式、支持事务、带有分区的内部表,这几乎是 Hive 生产环境的最佳实践标准配置。
1225

被折叠的 条评论
为什么被折叠?



