118

谁能告诉我 Hive 的外部表和内部表之间的区别。我知道放下桌子时会有所不同。我不明白您的意思是数据和元数据在内部被删除,而只有元数据在外部表中被删除。任何人都可以用节点来解释我吗?

4

18 回答 18

121

Hive 在用于跟踪状态的主节点上有一个关系数据库。例如,当 you 时CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';,此表模式存储在数据库中。

如果您有分区表,则分区存储在数据库中(这允许 hive 使用分区列表而无需进入文件系统并找到它们等)。这些东西就是“元数据”。

删除内部表时,它会删除数据,还会删除元数据。

当您删除外部表时,它只会删除元数据。这意味着 hive 现在对这些数据一无所知。它不会触及数据本身。

于 2013-06-11T07:31:49.193 回答
103

Hive 表可以创建为外部或内部。这是一个影响数据加载、控制和管理方式的选择。

在以下情况下使用 EXTERNAL 表:

  1. 这些数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
  2. 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者如果您正在迭代各种可能的模式,这可能适用。
  3. 您想使用自定义位置,例如 ASV。
  4. Hive 不应该拥有数据和控制设置、目录等,你有另一个程序或进程来做这些事情。
  5. 您不是基于现有表(AS SELECT)创建表。

在以下情况下使用内部表:

数据是临时的。

您希望 Hive 完全管理表和数据的生命周期。

于 2014-01-30T09:37:44.050 回答
52
于 2016-05-12T16:00:01.327 回答
6

内部表数据存储在仓库文件夹中,而外部表数据存储在您在创建表时提到的位置。

因此,当您删除内部表时,它会删除架构以及仓库文件夹下的数据,但对于外部表,您只会丢失架构。

因此,当您希望在删除外部表后再次返回您时,可以再次创建具有相同架构的表并将其指向原始数据位置。希望现在很清楚。

于 2015-06-09T13:12:24.777 回答
5

到目前为止,基于我有限的研究和测试(使用 Hive 1.1.0 -cdh5.12.0),行为(不是预期用途)的唯一区别似乎是删除表时

  • 内部(托管)表的数据从 HDFS 文件系统中删除
  • 而外部表的数据不会从 HDFS 文件系统中删除。

(注意:请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL中的“托管和外部表” 部分,其中列出了我不完全理解的一些其他差异)

我相信Hive会根据以下从上到下的优先级选择需要创建表的位置

  1. 在表创建期间定义的位置
  2. 在创建表的数据库/模式创建中定义的位置。
  3. 默认 Hive 仓库目录(hive.site.xml 中的属性 hive.metastore.warehouse.dir)

在“创建配置单元表”过程中不使用“位置”选项时,使用上述优先规则。这适用于内部和外部表。这意味着内部表不必驻留在 Warehouse 目录中,也可以驻留在其他任何地方。

注意:我可能错过了一些场景,但根据我有限的探索,内部表和外部表的行为似乎是相同的,除了上面描述的一个区别(数据删除)。我为内部和外部表尝试了以下方案。

  1. 使用和不使用 Location 选项创建表
  2. 使用和不使用分区选项创建表
  3. 使用 Hive Load 和 Insert 语句添加新数据
  4. 将数据文件添加到 Hive 外部的表位置(使用 HDFS 命令)并使用“MSCK REPAIR TABLE 命令”刷新表
  5. 删除表格
于 2017-09-30T06:50:59.337 回答
3

在外部表中,如果你删除它,它只删除表的模式,表数据存在于物理位置。所以要删除数据使用 hadoop fs -rmr tablename 。托管表配置单元将完全控制表。在外部表中,用户可以控制它。

于 2013-07-24T18:05:05.437 回答
2

INTERNAL首先创建稍后加载数据

EXTERNAL:存在数据并在其上创建

于 2017-11-26T17:52:46.540 回答
1

考虑最适合外部表的场景:

MapReduce (MR) 作业过滤一个巨大的日志文件以吐出n子日志文件(例如每个子日志文件包含特定的消息类型日志),并且输出即n子日志文件存储在 hdfs 中。

这些日志文件将被加载到 Hive 表中以执行进一步分析,在这种情况下,我建议使用外部表,因为实际的日志文件是由外部进程生成和拥有的,即 MR 作业,除了您可以避免还将每个生成的日志文件加载到相应的 Hive 表中的附加步骤。

于 2014-09-15T06:28:45.417 回答
1

另外请记住,Hive 是一个大数据仓库。当您想要删除一个表时,您不想丢失千兆字节或太字节的数据。以这种规模生成、移动和复制数据可能非常耗时。当您删除“托管”表时,配置单元也会丢弃其数据。当您删除“外部”表时,只会删除配置单元元存储中的模式定义。hdfs上的数据仍然存在。

于 2014-10-02T16:21:54.567 回答
1

外部 hive 表的优点是当我们删除表时它不会删除文件,我们可以使用不同的设置设置行格式,例如 serde....delimited

于 2014-09-03T09:55:09.447 回答
1

Internal tables are useful if you want Hive to manage the complete lifecycle of your data including the deletion, whereas external tables are useful when the files are being used outside of Hive.

于 2014-07-24T21:48:57.390 回答
1

配置单元中外部表的最佳用例是当您要从 CSV 或文本文件创建表时

于 2017-09-25T12:36:45.660 回答
0

当我们使用外部表时,hive 仅将元数据存储在 metastore 中,并将原始数据存储在 hive 外部

于 2015-07-04T13:09:01.030 回答
0

我想补充一点

  1. 当需要更新数据或需要删除某些行时使用内部表,因为内部表可以支持 ACID 属性,但外部表不支持 ACID 属性。
  2. 请确保内部表中有数据的备份,因为如果删除了内部表,那么数据也会丢失。
于 2020-03-25T13:57:53.737 回答
0

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

在内部表中保存数据时,Hive 完全管理表和数据的生命周期。这意味着一旦删除了内部表,数据就会被删除。如果删除了外部表,则表元数据将被删除,但数据会被保留。大多数时候,首选外部表,以避免误删除数据和表。

于 2015-12-18T12:56:04.750 回答
0

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

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

那时,定义了指向该数据的外部表,但不拥有它的所有权。

于 2016-05-05T06:37:30.573 回答
0

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

于 2018-04-30T08:37:04.930 回答
-2

简单来说,有两点:

Hive 可以管理仓库中的东西,即它不会删除仓库中的数据。当我们删除表时:

1) 对于内部表,数据在仓库内部进行管理。所以会被删除。

2) 对于外部表,数据从仓库中永久管理。所以不能被删除,除 hive 之外的客户端也可以使用它。

于 2017-05-15T12:17:40.000 回答