核心区别在于 Hive 对数据生命周期和存储位置控制权的不同。
一句话总结
- 内部表 (Managed Table):Hive 完全管理 数据和元数据。
DROP TABLE会删除元数据和数据本身。 - 外部表 (External Table):Hive 只管理元数据。
DROP TABLE会只删除元数据,而数据本身保持不变。
详细对比
| 特性 | 内部表 (Managed Table) | 外部表 (External Table) |
|---|---|---|
| 创建语法 | CREATE TABLE table_name (...); | CREATE EXTERNAL TABLE table_name (...) LOCATION '/path/to/data'; |
| 关键字 | 默认,无需特殊关键字 | 必须使用 EXTERNAL 关键字 |
| 数据所有权 | Hive 拥有数据。Hive 认为它完全控制这些数据。 | Hive 不拥有数据。数据通常由其他工具(如 Spark、Flink)或流程生成和管理。 |
| DROP TABLE 行为 | 元数据(表结构)和存储在实际路径下的数据都会被删除。 | 仅删除元数据(表结构)。数据文件本身在 HDFS 或其他存储系统中原封不动。 |
| 数据存储位置 | 如果未使用 LOCATION 指定,数据会存储在 Hive 默认的仓库目录中(通常是 /user/hive/warehouse)。 | 必须使用 LOCATION 关键字 指定一个已存在数据的路径。 |
| 适用场景 | 1. 临时或中间数据:ETL 过程中的临时表。 2. 生命周期由 Hive 控制的数据:最终由 Hive 产生和使用的数据集。 3. 测试和开发。 | 1. 多引擎共享数据:数据同时被 Hive、Spark、Impala、Presto 等工具访问。 2. 防止误删数据:确保重要的原始数据不会因 Hive 操作而意外丢失。 3. 已有数据:在 HDFS 上已经存在数据,只想在 Hive 中建表映射以便查询。 |
| 风险 | 误用 DROP TABLE 会导致数据丢失,且不可恢复(除非有备份)。 | 需要自行管理底层数据文件(如通过其他手段删除、更新)。Hive 不会清理这些文件。 |
示例说明
1. 创建内部表并加载数据
-- 创建内部表(省略 EXTERNAL 关键字)
CREATE TABLE managed_employee (
id INT,
name STRING,
salary FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ',';
-- 加载数据(数据会被移动到 Hive 的默认仓库路径下)
LOAD DATA INPATH '/input/employee_data.csv' INTO TABLE managed_employee;
此时,原始文件 /input/employee_data.csv 会被移动到 Hive 仓库目录(例如 hdfs:///user/hive/warehouse/managed_employee)中。
如果执行:
DROP TABLE managed_employee;
那么,元数据(表名、结构等)和仓库目录下的数据文件 employee_data.csv 都会被彻底删除。
2. 创建外部表并指向已有数据
假设我们已经在 HDFS 上有一个重要数据集:
hdfs:///data/logs/2023/10/access_log.txt
我们不想移动或改变这个文件,但想用 Hive 来查询它。
-- 创建外部表(必须使用 EXTERNAL 关键字和 LOCATION)
CREATE EXTERNAL TABLE external_logs (
ip STRING,
time STRING,
url STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION '/data/logs/2023/10/'; -- 指向目录,Hive 会读取该目录下所有文件
现在,Hive 可以查询 external_logs 表,但数据仍然保存在原来的位置 /data/logs/2023/10/。
如果执行:
DROP TABLE external_logs;
Hive 只会删除 external_logs 表的元数据。而 HDFS 上的 /data/logs/2023/10/access_log.txt 文件仍然存在,可以被其他程序继续使用。
如何选择?
- 使用内部表:当你希望 Hive 全权管理 数据的生命周期时。例如,经过 Hive ETL 处理后的最终结果表,并且这些数据 primarily 由 Hive 访问。
- 使用外部表:
- 数据需要被多个计算框架(如 Spark、MapReduce)共享。
- 数据是基础数据或原始数据,非常重要,不能被意外删除。
- 数据不是由 Hive 创建的,你只是想通过 Hive 来查询它。
最佳实践
一种常见的数仓模式是:
- ODS (操作数据层): 使用外部表指向原始数据文件(如日志、业务数据库导出),防止误删。
- DWD/DIM (明细/维度层): 使用 Hive(内部表或外部表)进行清洗、转换、整合。
- DWS/ADS (汇总/应用层): 通常使用内部表存储最终的聚合结果,这些数据的生命周期完全由 Hive 管理。

6293

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



