hive内部表和外部表的核心区别

319 阅读3分钟

在Apache Hive中,内部表(Internal Tables)和外部表(External Tables)是两种不同类型的表,它们之间有几个区别:

1. 数据所有权(最最核心的区别)

  • 内部表:当您创建一个内部表时,Hive会负责管理该表的数据。这意味着当你删除内部表时,表下的所有数据也会被一起删除。
  • 外部表:当你创建一个外部表时,你指定一个已经存在的HDFS路径作为该表的数据存储位置。因此,外部表不拥有其数据,而是指向已经存在的数据。这意味着即使你删除了一个外部表,该表的数据仍然保留在HDFS中。

2. 数据生命周期

  • 内部表:内部表的数据生命周期与其表的生命周期紧密相关。删除内部表时,其数据也会被删除。
  • 外部表:外部表的数据生命周期与其表的生命周期无关。删除外部表时,其数据不会被删除。

3. 创建表的命令

  • 内部表:创建内部表时,Hive会在内部的HDFS目录下创建一个新的目录来存储数据。
  • 外部表:创建外部表时,你需要指定一个已经存在的HDFS路径,该路径包含表的数据。这样做的好处是可以在不移动数据的情况下创建表。

4. 使用场景

  • 内部表:适合于需要Hive完全管理其数据生命周期的场景。
  • 外部表:适合于希望保留数据独立性,或者与现有数据集进行快速关联的场景。例如,当你的数据已经在HDFS上存在,并且不想因为删除表而丢失数据时。

5. 删除表的影响

  • 内部表:删除内部表时,Hive会同时删除表及其数据。
  • 外部表:删除外部表时,只删除表的元数据,不删除表的数据。

6. 元数据和数据分离

  • 内部表:内部表的元数据和数据都由Hive管理。
  • 外部表:外部表的元数据由Hive管理,但数据是由用户自己管理。

此外,内部表快速复制表可以用create table db2.inner_tb3 as select * from db2.inner_tb1;这样的语句一步到位的复制表结构和表数据,但是外部表不可以用“create table 新表 as select * from 旧表;”这样的语句。

而且,对于内部表,可以用truncate清空表内数据(不删除元数据,表结构仍然存在,只是实际数据没有了),但是外部表对hdfs数据没有管理权,所以不能truncate清空里面数据,若执行 truncate table outer_tb1;会报错。

并且,内部表和外部表的表类型显示的也不一样,使用desc formatted 表名;查看表格式化信息时候会看到内部表的表类型(Table Type:)是MANAGED_TABLE,而外部表是EXTERNAL_TABLE。

总结来说,内部表更适合于需要Hive自动管理数据的情况,而外部表则适用于需要更多灵活性和数据独立性的场景。选择哪种类型的表取决于你的具体需求和数据管理策略。