【问题标题】:Does DROP PARTITION delete data from external table in HIVE?DROP PARTITION 是否从 HIVE 的外部表中删除数据?
【发布时间】:2016-11-14 02:00:24
【问题描述】:

HIVE 中的外部表按年、月和日进行分区。

以下查询是否会从 external 表中删除此查询中引用的特定分区的数据?:-

ALTER TABLE MyTable DROP IF EXISTS PARTITION(year=2016,month=7,day=11);

【问题讨论】:

    标签: hive external-tables hive-partitions hiveddl


    【解决方案1】:

    分区方案不是数据。分区方案是存储在元数据中的表 DDL 的一部分(简单地说:分区键值 + 存储数据文件的位置)。

    数据本身存储在分区位置(文件夹)的文件中。 如果您删除外部表的分区,该位置保持不变,但作为分区卸载(有关此分区的元数据被删除)。您可以卸载几个版本的分区位置(例如以前的版本)。

    您可以删除分区并将另一个位置挂载为分区 (alter table add partition) 或更改现有分区位置。还删除外部表不要删除其中包含文件的表/分区文件夹。稍后您可以在此位置上创建表格。

    查看此答案以更好地理解外部表/分区概念:It is possible to create many tables (both managed and external at the same time) on top of the same location in HDFS.

    【讨论】:

      【解决方案2】:

      没有外部表只有将被删除的引用,实际文件仍将保留在位置。

      外部表数据文件不属于表,也没有移动到配置单元仓库目录

      只有 PARTITION 元数据将从配置单元元存储表中删除。..

      内部表和外部表的区别:

      对于外部表 -

      外部表将文件存储在 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 可能有内部或外部表,这是一个影响数据加载、控制和管理方式的选择。

      在以下情况下使用外部表:

      数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者如果您正在迭代各种可能的模式,这可能适用。 Hive 不应该拥有数据和控制设置、目录等,您可能有另一个程序或进程来执行这些操作。 您不是基于现有表 (AS SELECT) 创建表。

      在以下情况下使用内部表:

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

      注意:如果要查看数据库元表(配置details

      |BUCKETING_COLS      |
      | COLUMNS            |
      | DBS                |
      | NUCLEUS_TABLES     |
      | PARTITIONS         |
      | PARTITION_KEYS     |
      | PARTITION_KEY_VALS |
      | PARTITION_PARAMS   |
      | SDS                |
      | SD_PARAMS          |
      | SEQUENCE_TABLE     |
      | SERDES             |
      | SERDE_PARAMS       |
      | SORT_COLS          |
      | TABLE_PARAMS       |
      | TBLS               | 
      

      【讨论】:

      • 那么这个命令的确切结果是什么?显然不是删除对表的引用,而是删除分区,但这也只是特定的分区,对于真正发生的事情有点混乱。
      • 为此可以简单地说 ALTER TABLE MyTable DROP IF EXISTS PARTITION(year,month,day);那会删除分区元数据——为什么要为特定分区提供值?
      • 我很抱歉,但这并不能解释。根据您之前所说,它只会删除元数据。现在在第二个回复中,您说它需要元信息来查找数据。如果数据不会被删除,为什么还需要查找数据?只要涉及到分区删除,我认为不可能只删除与一个特定分区关联的分区方案。分区方案是针对整个表的,所以如果我们要完全禁用分区,就必须在整个表上完成。
      • 我添加了更多细节
      • 感谢您的努力,非常感谢。但这不是我要问的。我确切地知道什么是内部表,什么是外部表。我的观点是——分区方案怎么只针对一个特定的分区关闭,这怎么可能?
      猜你喜欢
      • 2017-04-07
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多