hive中表类型有哪些

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 分析场景。
ParquetSTORED AS PARQUET另一种高性能列式存储,尤其受 Spark 生态青睐,支持嵌套数据结构。与 Spark 交互频繁的场景,复杂数据类型。
AvroSTORED 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 生产环境的最佳实践标准配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值