【问题标题】:What is the significance of hive external table?hive外部表的意义是什么?
【发布时间】:2015-12-03 18:43:26
【问题描述】:
第 1 步。我创建一个 hive 外部表“test”并给出一些位置说“/user/hive2”。
第 2 步。我在“测试”表中加载一个文件。
第 3 步。我从测试中选择 *。我得到了我的记录。
第 4 步。我通过 drop table test 删除表。
第 5 步。我从测试中选择 * 并找不到表。
那么使用外部表有什么意义呢?如果“测试”表的元数据被删除了,我不能查询任何东西,那我们为什么要使用外部表呢?
【问题讨论】:
标签:
hadoop
mapreduce
hive
【解决方案1】:
@Nishant :在这个论坛提出一般性问题之前,您应该做一些功课。无论如何,这里有一个快速链接,用于详细解释 Hive 外部表 - External Hive Tables
当您删除内部表时,它会删除数据,还会删除元数据。您将无法再访问数据
当您删除外部表时,它只会删除元数据。这意味着 hive 现在对这些数据一无所知。它不会触及数据本身。您现在可以访问数据并执行任何操作(如果需要)。当您需要为数据停顿,然后将整个数据转储到托管表中以进行配置单元操作时,外部表也是首选
另外,这是来自另一个 stackoverflow 线程的注释
在以下情况下使用外部表:
- 数据也在 Hive 之外使用。例如,数据文件由不锁定文件的现有程序读取和处理。
- 即使在 DROP TABLE 之后,数据也需要保留在底层位置。如果您将多个模式(表或视图)指向单个数据集,或者如果您正在迭代各种可能的模式,这可能适用。
- 您想使用自定义位置,例如 ASV。
- Hive 不应该拥有数据和控制设置、目录等,你有另一个程序或进程可以做这些事情。
- 您不是基于现有表 (AS SELECT) 创建表。
在以下情况下使用内部表:
- 数据是临时的。
- 您希望 Hive 完全管理表和数据的生命周期。
您希望 Hive 完全管理表和数据的生命周期。
希望这有帮助。
【解决方案2】:
一些事情。
您正在指定数据的位置。如果您只是创建一个托管表,Hive 将决定它存储表数据的位置,但在外部表中,您可以确定该位置。
外部表可以指向已存在于指定位置的数据。在您的示例中,您正在插入一个空的外部表,但一个用例是创建指向数据所在位置的表。换句话说,如果数据已经存在,则根本不需要插入到表中。
最重要的是,如果删除表,数据不会被删除。在托管表中,如果您插入数据然后删除表,Hive 会从元存储中删除表定义,但也会删除数据本身。在外部表中,仅删除元存储引用,数据保留在您指定的位置。
【解决方案3】:
第 4 步。我通过 drop table test 删除表。
第 5 步。我确实从测试中选择 *,但未找到表。
让我们假设您重新创建了表测试。
尝试从测试中选择 *。此查询返回数据 bcoz table test is external table。
表被删除(元数据),但数据存在于 HDFS 中。
同样的情况不会发生在从 HDFS 中删除数据的内部表中。
【解决方案4】:
那么使用外部表有什么意义呢?如果“测试”表的元数据被删除了,我不能查询任何东西,那我们为什么要使用外部表呢?
当您删除外部表时,基础数据文件保持不变。如果要查询表,请不要删除元数据。如何通过删除元数据来查询表?
与内部表不同,内部表的数据是临时的,在创建表后会被删除,外部表仍然将数据保存在源目录中。看看相关question
即使删除元数据后,您仍然可以访问源目录下的数据文件。
【解决方案5】:
- 如果您想通过 ETL 工具访问表,那么我们必须创建外部表。
- 如果要创建与表 1 具有相同架构的表 2,则外部表很有用。
将外部表 table2 创建为 (select * from table1)
- 如果您想通过保持旧数据集原样将新数据集添加到表中,则外部表很有用。