有谁可以告诉我Hive的外部表和内部表之间的区别。我知道这个区别在删除表时会体现出来。但是我不理解为什么在内部表中数据和元数据都被删除,而在外部表中只有元数据被删除。有人能用节点的术语来解释一下吗?
CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
创建一个表时,该表的模式被存储在数据库中。Hive表可以创建为EXTERNAL或INTERNAL。这是一个选择,影响数据的加载、控制和管理。
当满足以下条件时,请使用EXTERNAL表:
当满足以下条件时,请使用INTERNAL表:
数据是临时的。
您希望Hive完全管理表和数据的生命周期。
对于外部表,Hive将数据存储在创建表时指定的位置中(通常不在仓库目录中)。如果删除外部表,则表元数据将被删除但数据不会被删除。
对于内部表,Hive将数据存储在其仓库目录中。如果删除该表,则表元数据和数据都将被删除。
内部表和外部表的区别:
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中进行管理,可能在模式级别进行(取决于实现)。
内部表数据存储在仓库文件夹中,而外部表数据存储在表创建时所指定的位置。
因此,当您删除内部表时,会同时删除位于仓库文件夹下的模式以及数据,但对于外部表而言,只有模式会被删除。
如果您要重新获取已删除的外部表,可以再次创建具有相同模式的表,并将其指向原始数据位置。希望现在清楚了。
(注意:请参阅“托管和外部表”部分,网址为https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL,其中列出了我没有完全理解的其他差异)
我相信Hive会基于以下优先顺序从上到下选择需要创建表的位置:
当在“创建Hive表”的过程中未使用“Location”选项时,将使用上述优先规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在仓库目录中,可以驻留在任何其他地方。
注:可能会有一些场景我没有涉及到,但根据我的有限探索,内部表和外部表的行为似乎相同,除了上述的一个差异(数据删除)。我尝试了以下场景,对于内部和外部表都进行了测试:
外部hive表的优点在于删除表时不会删除文件,我们可以设置不同的行格式,如serde....delimited
如果您希望Hive管理数据的完整生命周期(包括删除),则内部表非常有用;而当文件在Hive之外使用时,外部表非常有用。