Hive内部表和外部表之间的区别?


110

谁能告诉我Hive的外部表和内部表之间的区别。我知道放桌子时会有所不同。我不明白您所说的数据是什么,内部会删除元数据,而在外部表中只会删除元数据。谁能解释我的节点。

Answers:


117

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

如果您有分区表,则分区存储在数据库中(这使hive无需使用文件系统即可找到分区列表等)。这些事情就是“元数据”。

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

当您删除外部表时,它只会删除元数据。这意味着配置单元现在不知道该数据。它不会触摸数据本身。


好的..例如,我创建了一个外部表..然后将其删除。怎么了?数据未触及是什么意思?如果我选择该表的*,它将显示吗?我无法想象区别。
DrewRose

11
如果删除表,Hive将返回删除表之前的状态。如果在删除foo之后运行查询'select * from foo',hive会告诉您该表不存在。这是因为您已告诉蜂巢忘记该表。数据仍然存在于以前的任何文件系统中。将元数据视为数据所在的“指针”。
Prestosto

1
因此,您要告诉我是否有数据位于dis位置opt / nancy / foo.txt中,并将其加载到外部表中并删除它,元数据丢失了,但此位置opt / nancy / foo.txt中的数据仍然保留吗?
DrewRose

好,现在是HDFS还是我的本地系统中的这个位置?如果它在本地系统中,则当我将数据加载到内部表中并放下该表时,文件foo.txt仍将保留在该位置。我到目前为止正确吗?
DrewRose

3
配置单元表位于受支持的文件系统(Hbase,HDFS,S3等)上。我假设您正在使用“ LOAD DATA”将数据从本地文件加载到配置单元表中?在这种情况下,您要将本地文件复制到配置单元表中。当您删除该表时,内部表中数据的副本将被删除,但“ LOAD DATA”命令中的源文件仍将保持完整。
Prestosto

100

配置单元表可以创建为EXTERNAL或INTERNAL。这是一个影响数据加载,控制和管理方式的选择。

在以下情况下使用EXTERNAL表:

  1. 该数据还用于Hive之外。例如,数据文件由不锁定文件的现有程序读取和处理。
  2. 即使在放置DROP TABLE之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者正在遍历各种可能的模式,则可以应用此方法。
  3. 您要使用自定义位置,例如ASV。
  4. Hive不应拥有数据和控件设置,目录等,您可以使用其他程序或进程来执行这些操作。
  5. 您不是基于现有表(AS SELECT)创建表。

在以下情况下使用INTERNAL表:

数据是临时的。

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



创建内部表会从HDFS删除数据还是将其复制并专门用于配置单元而使源(HDFS)保持完整?
luckyluke

@swetha嗨,我来这里是因为我完全删除了metastore.db,但数据仍保留在hdfs上。所以当我显示表格时,什么也没显示。有没有一种方法可以重新创建元数据?
awadhesh14

46

回答您的问题:

对于外部表,Hive将数据存储在表创建期间指定的LOCATION中(通常不在仓库目录中)。如果删除了外部表,那么将删除表元数据,但不会删除数据。

对于内部表,Hive将数据存储到其仓库目录中。如果删除了表,则表元数据和数据都将被删除。


供你参考,

内部和外部表之间的区别:

对于外部表-

  • 外部表将文件存储在HDFS服务器上,但表未完全链接到源文件。

  • 如果删除外部表,该文件仍保留在HDFS服务器上。

    例如,如果您使用HIVE-QL在HIVE中创建一个名为“ table_test”外部表并将该表链接到文件“ file”则从HIVE中删除“ table_test”不会从HDFS中删除“ file”

  • 有权访问HDFS文件结构的任何人都可以访问外部表文件,因此需要在HDFS文件/文件夹级别管理安全性。

  • 元数据保留在主节点上,从HIVE中删除外部表只会删除元数据,而不会删除数据/文件。


对于内部表-

  • 存储在基于设置的目录中hive.metastore.warehouse.dir默认情况下,内部表存储在以下目录“ / user / hive / warehouse”中,您可以通过更新配置文件中的位置来更改它。
  • 删除表将分别从主节点和HDFS中删除元数据和数据。
  • 内部表文件安全性仅通过HIVE控制。安全需要在HIVE内部进行管理,可能在架构级别(取决于组织)。

Hive可能具有内部或外部表,这是一个会影响数据加载,控制和管理方式的选择。

在以下情况下使用EXTERNAL表:

  • 数据还用于Hive之外。例如,数据文件由不锁定文件的现有程序读取和处理。
  • 即使在放置DROP TABLE之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者正在遍历各种可能的模式,则可以应用此方法。
  • Hive不应拥有数据和控件设置,目录等,否则您可能会有另一个程序或进程来执行这些操作。
  • 您不是基于现有表(AS SELECT)创建表。

在以下情况下使用INTERNAL表:

  • 数据是暂时的
  • 您希望Hive完全管理表和数据的生命周期

资源 :

HDInsight:Hive内部和外部表简介

Hadoop- HIVE中的内部和外部表


1
@CapturedTree但是答案不正确。“ Hive将数据移到其仓库目录中。”-这是完全错误的,事实并非如此。数据存储在表位置。无关紧要外部或托管。
leftjoin '18

6

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

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

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


4

到目前为止,根据我有限的研究和测试(使用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. 创建带有和不带有“位置”选项的表
  2. 创建带有和不带有分区选项的表
  3. 使用Hive Load和Insert语句添加新数据
  4. 将数据文件添加到Hive外部的Table位置(使用HDFS命令),并使用“ MSCK REPAIR TABLE命令刷新表
  5. 放下桌子

很好的探索。这是解释蜂巢如何处理内部和外部表的位置选项的唯一答案。
d2207197 '18

3

在外部表中,如果将其删除,它将仅删除表的架构,表数据存在于物理位置。因此,要删除数据,请使用hadoop fs-rmr表名。托管表配置单元将完全控制表。在外部表中,用户可以控制它。


我遇到的情况是,在通过CREATE TABLE foo(id INT)创建的内部表上的DROP TABLE之后,目录并不总是被删除。元数据显然可以使用,因为SHOW TABLES是一致的-删除该表后,该表不会出现在该列表中。令人困惑的是,我注意到目录/ is /有时被删除了,但是我无法始终如一地重新创建它。有任何想法吗?
马修·康奈尔

是否检查了表的权限?您可能已将HDFS上的位置所有权更改为其他用户。
Milind Jindal

1

如果希望Hive管理数据的整个生命周期(包括删除),则内部表很有用,而在Hive之外使用文件时,外部表很有用。


1

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


1

还请记住,Hive是一个大数据仓库。当您要删除表时,您不想丢失千兆字节或TB级的数据。以这种规模生成,移动和复制数据可能很耗时。当您删除“托管”表配置单元时,配置单元也会破坏其数据。当您删除“外部”表时,将仅删除配置单元元存储中的架构定义。hdfs上的数据仍然保留。


1

请考虑最适合外部表的这种情况:

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

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


1

蜂巢中外部表的最佳用例是当您想从CSV或文本文件创建表时


0

当我们使用外部表时,配置单元仅将元数据存储在metastore中,将原始数据存储在配置单元的外部,这样我们就可以给出位置'',因为当我们删除表时,原始数据不会起作用


0

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

当将数据保存在内部表中时,Hive可以完全管理表和数据的生命周期。这意味着一旦删除内部表,数据将被删除。如果删除了外部表,则删除表元数据,但保留数据。在大多数情况下,最好使用外部表,以避免误删除数据和表。


0

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

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

当时,已定义了指向该数据的外部表,但没有该数据的所有权。


0

内部中创建第一数据被加载

EXTERNAL数据在上面创建它。


0

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


0

我想补充一点

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

-2

简单来说,有两件事:

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

1)对于内部表,数据在仓库内部进行管理。因此将被删除。

2)对于外部表,从仓库永恒地管理数据。因此不能删除,除蜂巢以外的其他客户端也可以使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.