Hive内部表和外部表有什么区别?

125

有谁可以告诉我Hive的外部表和内部表之间的区别。我知道这个区别在删除表时会体现出来。但是我不理解为什么在内部表中数据和元数据都被删除,而在外部表中只有元数据被删除。有人能用节点的术语来解释一下吗?

19个回答

1

内部表和外部表都属于HIVE,唯一的区别在于数据所有权。下面展示了创建两种表的命令。只有在创建外部表时才会添加EXTERNAL关键词。两种表都可以使用SQL语句进行创建/删除/修改

内部表中,表和表中包含的数据都由HIVE管理。也就是说,我们可以使用HIVE添加/删除/修改任何数据。当我们DROP表时,表和其中的数据也将被删除。

例如CREATE TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

外部表中,只有表由HIVE管理。这些表中的数据可以来自任何存储位置,如HDFS。我们不能添加/删除/修改这些表中的数据。我们只能使用SELECT语句来使用这些表中的数据。当我们DROP表时,只有表被删除,其中包含的数据不会被删除。这就是为什么说只有元数据被删除。当我们创建外部表时,需要指定数据的位置。

例如CREATE EXTERNAL TABLE tweets (text STRING, words INT, length INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/hive/warehouse/tweets';


您可以使用INSERT OVERWRITE TABLE将记录插入到外部表中。 - Haranath Boggarapu

1
外部表在Hive中最好的使用场景是当您想要从文件(CSV或文本)创建表时。

1

内部表: 首先创建表格,然后稍后加载数据。

外部表: 数据已存在,在其上方创建表格


不一定,您可以创建一个外部表,稍后再插入数据。 - Jyoti Dhiman

0

当HDFS中已经有数据时,可以创建一个外部Hive表来描述数据。它被称为EXTERNAL,因为外部表中的数据是在LOCATION属性中指定而不是默认的仓库目录中。

当将数据保存在内部表中时,Hive完全管理表和数据的生命周期。这意味着一旦删除内部表,数据也会被删除。如果删除外部表,则表元数据会被删除,但数据会被保留。大多数情况下,为了避免错误地删除数据,外部表更受欢迎。


0

我想补充一下:

  1. 当数据需要更新或某些行需要删除时,使用内部表,因为内部表可以支持ACID属性,而外部表不支持。
  2. 请确保在内部表中备份数据,因为如果删除内部表,则数据也将丢失。

0

Hive 只在 metastore 中存储元数据,而将原始数据存储在 hive 外部。当我们使用外部表时,可以通过指定“location”来避免删除表时影响原始数据。


0

对于托管表,Hive 控制其数据的生命周期。Hive 默认将托管表的数据存储在 hive.metastore.warehouse.dir 定义的目录下的子目录中。

当我们删除托管表时,Hive 会删除表中的数据。但是托管表与其他工具共享不太方便。例如,假设我们有一些由 Pig 创建和使用的数据,但我们想针对这些数据运行一些查询,而不将数据的所有权交给 Hive。

此时,定义外部表指向该数据,但不拥有该数据。


0
在Hive中,我们也可以创建外部表。它告诉Hive引用仓库目录之外现有位置的数据。 删除外部表将删除元数据但不会删除数据。

-2
简单来说,有两件事:
Hive可以管理仓库中的内容,即它不会删除仓库中的数据。当我们删除表时:
1)对于内部表,数据在仓库中进行内部管理,因此将被删除。
2)对于外部表,数据在仓库之外进行管理,因此无法删除,除hive以外的客户端也可以使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接