托管表与外部表

Hive 从根本上知道两种不同类型的表:

  • Managed (Internal)

  • External

Introduction

该文档列出了两者之间的某些差异,但是基本的区别是 Hive 假定它拥有托管表的数据。这意味着数据,其属性和数据布局将并且只能通过 Hive 命令进行更改。数据仍然存在于正常的文件系统中,没有任何事情阻止您更改它而无需告知 Hive。如果这样做确实违反了 Hive 的不变性和期望,则可能会看到不确定的行为。

另一个结果是数据被附加到 Hive 实体。因此,每当您更改实体(例如删除表)时,数据也会更改(在这种情况下,数据将被删除)。这与传统的 RDBMS 非常相似,在传统的 RDBMS 中,您也不会自行 Management 数据文件,而是使用基于 SQL 的访问权限来 Management 数据文件。

对于外部表,Hive 假定它“不”Management 数据。

可以使用描述格式 table_name命令标识托管表或外部表,该命令将根据表类型显示 MANAGED_TABLE 或 EXTERNAL_TABLE。

Statistics可以在内部和外部表及分区上进行 Management 以优化查询。

Feature comparison

这意味着有很多功能仅适用于两种表类型之一,而不适用于另一种。这是不完整的清单:

  • ARCHIVE/UNARCHIVE/TRUNCATE/MERGE/CONCATENATE 仅适用于托管表

  • DROP 删除托管表的数据,而只删除外部表的元数据

  • ACID /事务处理仅适用于托管表

  • 查询结果缓存仅适用于托管表

  • 外部表仅允许 RELY 约束

  • 某些物化视图功能仅适用于托管表

Managed tables

托管表存储在hive.metastore.warehouse.dir path 属性下,默认情况下存储在类似于/user/hive/warehouse/databasename.db/tablename/的文件夹路径中。在表创建期间,默认位置可以被location属性覆盖。如果删除了托管表或分区,则将删除与该表或分区关联的数据和元数据。如果未指定 PURGE 选项,则数据将在定义的持续时间内移至废纸 trash 文件夹。

当 Hive 应该 Management 表的生命周期或生成临时表时,请使用托管表。

External tables

外部表描述了外部文件上的元数据/架构。外部表文件可以由 Hive 外部的进程访问和 Management。外部表可以访问存储在诸如 Azure 存储卷(ASV)或远程 HDFS 位置的源中的数据。如果更改了外部表的结构或分区,则可以使用MSCK 维修表 table_name语句刷新元数据信息。

当文件已经存在或位于远程位置时,请使用外部表,并且即使表已删除,文件也应保留。