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

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

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

如果你有一个分区表,这些分区将被存储在数据库中(这样就可以使用分区列表,而不需要去文件系统find它们等)。 这些东西就是“元数据”。

当你删除一个内部表时,它会丢弃数据,并且也会丢弃元数据。

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

Hive表可以创build为EXTERNAL或INTERNAL。 这是影响数据如何加载,控制和pipe理的select。

在以下情况下使用EXTERNAL表格:

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

在以下情况下使用INTERNAL表:

数据是暂时的。

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

回答你问题:

对于外部表,Hive不会将数据移动到其仓库目录中。 如果外部表被删除,那么表元数据被删除,但不是数据。

对于内部表,Hive将数据移动到其仓库目录中。 如果表被删除,那么表元数据和数据将被删除。


供你参考,

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

对于外部表 –

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

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

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

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

  • 元数据在主节点上维护,从HIVE删除外部表只删除元数据而不是数据/文件。


对于内部表格 –

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

Hive可能有内部或外部表,这是一个影响数据如何加载,控制和pipe理的select。

在以下情况下使用EXTERNAL表:

  • 这些数据也在Hive之外使用 。 例如,数据文件是由不locking文件的现有程序读取和处理的。
  • 数据需要保留在底层位置,即使在DROP TABLE之后。 如果您在单个数据集中指向多个模式(表或视图),或者您正在遍历各种可能的模式,则这可以适用。
  • 蜂巢不应该拥有数据和控制设置,目录等 ,你可能有另一个程序或进程将做这些事情。
  • 您不是基于现有表(AS SELECT)创build表。

在以下情况下使用INTERNAL表:

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

资源 :

HDInsight:Hive内部和外部表介绍

Hadoop-HIVE内部和外部表格

仓库文件夹中的内部表格数据存储,外部表格数据指向您在表格创build中提到的位置。 所以当你删除内部表时,它将删除架构以及仓库文件夹下的数据,但是在外部表中它的唯一架构将会松动。 所以,当你想要返回时,你可以再次创build一个带有模式的表格并指向位置。 希望现在清楚。

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

外部configuration表格具有删除表格时不会删除文件的优点,我们可以设置具有不同设置的行格式,如serde …. delimited

另外请记住,Hive是一个大数据仓库。 当你想删除一个表时,你不想丢失千兆或千兆字节的数据。 以这种规模生成,移动和复制数据可能非常耗时。 当你放弃一个'托pipe'表格configuration单元也会垃圾数据。 当您删除“外部”表时,只有从configuration单元元存储的模式定义被删除。 关于hdfs的数据仍然存在。

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

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

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

configuration单元中的外部表格的最佳用例是当您要从文件(CSV或文本)创build表格时

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

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

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

我相信Hive从上到下依据以下优先级来select需要创build表的位置

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

在“创buildconfiguration单元表”过程中未使用“位置”选项时,使用上述优先规则。 这适用于内部和外部表格。 这意味着内部表不一定要驻留在仓库目录中,并且可以驻留在其他任何地方。

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

  1. 使用和不使用位置选项创build表
  2. 使用和不使用分区选项创build表
  3. 使用Hive加载和插入语句添加新数据
  4. 将数据文件添加到Hive之外的Table位置(使用HDFS命令)并使用“MSCK REPAIR TABLE”命令刷新表
  5. 丢下桌子

如果您希望Hivepipe理数据的完整生命周期(包括删除),则内部表格非常有用,而在Hive之外使用这些文件时,外部表格非常有用。

当我们使用外部表时,hive只将meta数据存储在metaore中,而原始数据存储在hive外部,我们可以通过这些原始数据给出位置'',当我们放弃表

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

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

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

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

那时候,外部表被定义为指向那个数据,但是并不拥有它的所有权。

简而言之,有两件事情:

Hive可以pipe理仓库中的事物,即不会从仓库中删除数据。 当我们删除表格时:

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

2)对于外部表,数据是从仓库永久pipe理的。 所以不能被删除,然后客户端,然后configuration单元也可以使用它。