Answers:
Hive在主节点上有一个关系数据库,用于跟踪状态。例如,当您使用时CREATE TABLE FOO(foo string) LOCATION 'hdfs://tmp/';
,此表模式存储在数据库中。
如果您有分区表,则分区存储在数据库中(这使hive无需使用文件系统即可找到分区列表等)。这些事情就是“元数据”。
删除内部表时,它会删除数据,并且还会删除元数据。
当您删除外部表时,它只会删除元数据。这意味着配置单元现在不知道该数据。它不会触摸数据本身。
配置单元表可以创建为EXTERNAL或INTERNAL。这是一个影响数据加载,控制和管理方式的选择。
在以下情况下使用EXTERNAL表:
在以下情况下使用INTERNAL表:
数据是临时的。
您希望Hive完全管理表和数据的生命周期。
对于外部表,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表:
在以下情况下使用INTERNAL表:
资源 :
到目前为止,根据我有限的研究和测试(使用Hive 1.1.0 -cdh5.12.0),行为(不是预期的用法)的唯一区别似乎是当删除表时
(注意:请参阅https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL中的 “托管表和外部表”部分, 其中列出了我不完全理解的其他差异)
我相信Hive根据以下从上到下的优先级选择需要创建表的位置
在“创建配置单元表”期间未使用“位置”选项时,将使用上述优先级规则。这适用于内部和外部表。这意味着内部表不一定必须驻留在Warehouse目录中,并且可以驻留在其他任何位置。
注意:我可能错过了某些情况,但是基于有限的探索,内部表和外部表的行为似乎都相同,除了上述的一种区别(数据删除)。我为内部和外部表尝试了以下方案。
在外部表中,如果将其删除,它将仅删除表的架构,表数据存在于物理位置。因此,要删除数据,请使用hadoop fs-rmr表名。托管表配置单元将完全控制表。在外部表中,用户可以控制它。
如果希望Hive管理数据的整个生命周期(包括删除),则内部表很有用,而在Hive之外使用文件时,外部表很有用。
还请记住,Hive是一个大数据仓库。当您要删除表时,您不想丢失千兆字节或TB级的数据。以这种规模生成,移动和复制数据可能很耗时。当您删除“托管”表配置单元时,配置单元也会破坏其数据。当您删除“外部”表时,将仅删除配置单元元存储中的架构定义。hdfs上的数据仍然保留。
当HDFS中已经有数据时,可以创建一个外部Hive表来描述数据。之所以称为EXTERNAL,是因为外部表中的数据是在LOCATION属性中而不是默认仓库目录中指定的。
当将数据保存在内部表中时,Hive可以完全管理表和数据的生命周期。这意味着一旦删除内部表,数据将被删除。如果删除了外部表,则删除表元数据,但保留数据。在大多数情况下,最好使用外部表,以避免误删除数据和表。
在Hive中,我们还可以创建一个外部表。它告诉Hive引用仓库目录外部现有位置的数据。删除外部表将删除元数据,但不会删除数据。