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

时间:2013-06-11 07:12:19

标签: hadoop hive hiveql

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

17 个答案:

答案 0 :(得分:104)

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

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

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

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

答案 1 :(得分:89)

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

在以下情况下使用EXTERNAL表:

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

      

    数据是暂时的。

         

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

答案 2 :(得分:37)

回答你问题:

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

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

供您参考,

内部与外部的区别外部表:

  

对于外部表 -

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

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

         

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

  •   
  • 任何有权访问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 Internal and External Tables Intro

Internal & external tables in Hadoop- HIVE

答案 3 :(得分:4)

内部表数据存储在Warehouse文件夹中,外部表数据指向您在表创建中提到的位置。因此,当您删除内部表时,它会删除Schema以及Warehouse文件夹下的Data,但在外部表中,它的唯一Schema将会松散。因此,当您想要返回表时,您可以再次使用模式创建表并指向该位置。希望现在很清楚。

答案 4 :(得分:3)

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

答案 5 :(得分:2)

基于我迄今为止有限的研究和测试(使用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)
  4. 在“创建配置单元表”期间未使用“位置”选项时,将使用上述优先规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在Warehouse目录中,并且可以驻留在其他任何位置。

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

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

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

另请注意,Hive是一个大数据仓库。如果你想删除一个表,你不想丢失千兆字节或太字节数据。以该比例生成,移动和复制数据可能是耗时的。 当您放弃管理' table hive也会丢弃其数据。 放弃'外部'表仅删除了来自hive元存储的模式定义。 hdfs上的数据仍然存在。

答案 10 :(得分:1)

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

答案 11 :(得分:0)

我想添加

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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

此时,外部表定义为指向该数据,但不取得所有权。

答案 14 :(得分:0)

hive只存储元数据中的元数据和hive外部的原始数据,当我们使用外部表时我们可以给出位置' '通过这些我们的原始数据不会影响当我们放弃表

答案 15 :(得分:-1)

内部已创建第一次数据已加载以后 < / p>

EXTERNAL 数据 存在 上创建

答案 16 :(得分:-2)

简单来说,有两件事:

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

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

2)对于外部表,数据是从仓库永久管理的。因此无法删除,其他客户端也可以使用它。