步骤1。我创建了一个配置单元外部表"test",并给出一些位置,比如"/user/hive2"
步骤2。我在"测试"表中加载了一个文件
步骤3。我从测试中选择*。我拿到了我的记录
步骤4。我一次接一次地测试表格
步骤5。我确实从测试中选择了*,但找不到表。
那么,使用外部表格有什么意义呢?如果"测试"表的元数据被删除了,而我无法在上面查询任何内容,那么我们为什么要使用外部表呢?
@Nishant:在这个论坛上提出一般性问题之前,你应该做一些功课。无论如何,这里有一个快速链接,可以详细解释配置单元外部表的一般情况-外部配置单元表
当您删除内部表时,它会删除数据,还会删除元数据。您将无法再访问数据
当您删除外部表时,它只会删除元数据。这意味着蜂箱现在对这些数据一无所知。它不会触及数据本身。现在,您可以访问数据并执行任何操作(如果需要)。当您需要对数据进行进站,然后将整个数据转储到一个托管表中进行配置单元操作时,外部表也是首选
此外,这里还有来自另一个stackoverflow线程的注释
在以下情况下使用EXTERNAL表格:
- 该数据也在Hive之外使用。例如,数据文件由不锁定文件的现有程序读取和处理
- 即使在DROP TABLE之后,数据也需要保留在底层位置。如果将多个模式(表或视图)指向单个数据集,或者在各种可能的模式中进行迭代,则可以应用此方法
- 您希望使用自定义位置,例如ASV
- Hive不应该拥有数据和控制设置、目录等,你有另一个程序或进程来做这些事情
- 您不是在现有表的基础上创建表(AS SELECT)
使用内部表格时:
- 数据是临时的
- 您希望Hive能够完全管理表和数据的生命周期
您希望Hive能够完全管理表和数据的生命周期。
希望这会有所帮助。
一些事情。
-
您正在指定数据的位置。如果您只是创建一个托管表,Hive将决定将表数据存储在哪里,但在外部表中,您可以确定该位置。
-
外部表可以指向指定位置中已存在的数据。在您的示例中,您正在插入一个空的外部表,但一个用例是创建指向数据所在位置的表。换句话说,如果数据已经存在,则根本不需要插入到表中。
-
最重要的是,如果删除表,数据不会被删除。在托管表中,如果插入数据然后删除该表,配置单元会从元存储中删除表定义,但也会删除数据本身。在外部表中,只有元存储引用被删除,数据保留在您指定的位置。
步骤4。我一次接一次地测试。
步骤5。我确实从测试中选择了*,但找不到表。
假设您重新创建了表测试。
尝试从测试中选择*。此查询返回数据bcoz表测试为外部表。
该表被删除(元数据),但数据存在于HDFS中。
同样的情况不会发生在从HDFS中删除数据的内部表上。
那么,使用外部表格有什么意义呢?如果"测试"表的元数据被删除了,而我无法在上面查询任何内容,那么我们为什么要使用外部表呢?
删除外部表时,基础数据文件保持不变。如果要查询表,请不要删除元数据。如何通过删除元数据来查询表?
与内部表不同,在内部表中,数据是临时的,在创建表后会被删除,外部表仍然将数据保存在源目录中。看看的相关问题
即使删除了元数据,您仍然可以访问源目录 中的数据文件。
- 如果您想通过ETL工具访问表,那么我们必须创建外部表
- 若要创建一个与表1具有相同模式的表2,那个么外部表是有用的。将外部表table2创建为(从表1中选择*)
- 如果要通过保持旧数据集的原样向表中添加新数据集,则外部表非常有用