与配置单元中的外部表混淆

Confusion with the external tables in hive

我使用以下命令创建了外部配置单元 table:

 use hive2;

create external table depTable (depId int comment 'This is the unique id for each dep', depName string,location string) comment 'department table' row format delimited fields terminated by "," 
stored as textfile location '/dataDir/';  

现在,当我查看 HDFS 时,我可以看到数据库,但仓库中没有 depTable

[cloudera@quickstart ~]$ hadoop fs -ls /user/hive/warehouse/hive2.db
[cloudera@quickstart ~]$ 

从上面可以看出,这个数据库中没有创建table。据我所知,外部 table 没有存储在配置单元 warehouse.So 中,我说得对吗??如果是,那么它存储在哪里??
但是,如果我先创建外部 table 然后加载数据,那么我就可以在 hive2.db 中看到文件。

hive> create external table depTable (depId int comment 'This is the unique id for each dep', depName string,location string) comment 'department table' row format delimited fields terminated by "," stored as textfile;
OK
Time taken: 0.056 seconds
hive> load data inpath '/dataDir/department_data.txt' into table depTable;
Loading data to table default.deptable
Table default.deptable stats: [numFiles=1, totalSize=90]
OK
Time taken: 0.28 seconds
hive> select * from deptable;
OK
1001    FINANCE SYDNEY
2001    AUDIT   MELBOURNE
3001    MARKETING   PERTH
4001    PRODUCTION  BRISBANE

现在,如果我触发 hadoop fs 查询,我可以在数据库中看到这个 table,如下所示:

[cloudera@quickstart ~]$ hadoop fs -ls /user/hive/warehouse/hive2.db
Found 1 items
drwxrwxrwx   - cloudera supergroup          0 2019-01-17 09:07 /user/hive/warehouse/hive2.db/deptable  

如果我删除 table,我仍然可以在 HDFS 中看到 table,如下所示:

[cloudera@quickstart ~]$ hadoop fs -ls /user/hive/warehouse/hive2.db
Found 1 items
drwxrwxrwx   - cloudera supergroup          0 2019-01-17 09:11 /user/hive/warehouse/hive2.db/deptable  

那么,外部 table 的确切行为是什么??当我使用 LOCATION 关键字创建时,它存储在哪里,当我使用 load 语句创建时,为什么它存储在 HDFS 中,以及删除后为什么它没有被删除。

EXTERNALMANAGED table 之间的主要区别在于 Drop table/partition 行为。 当您删除 MANAGED table/partition 时,包含数据文件的位置也会被删除。 当您删除 EXTERNAL table 时,数据文件的位置保持不变。

更新: TBLPROPERTIES ("external.table.purge"="true") 在版本 4.0.0+ (HIVE-19981) 上设置外部 table 时也会删除数据.

EXTERNAL table 以及 MANAGED 正在存储在 DDL 中指定的位置。您可以在现有位置之上创建 table,并且该位置中已有数据文件,它对 EXTERNALMANAGED 都有效,没关系。

您甚至可以在同一位置同时创建 EXTERNALMANAGED table,请参阅此答案以获取更多详细信息和测试:

如果您指定了位置,则两种类型的 table 的数据都将存储在该位置。如果您没有指定位置,数据将位于默认位置:/user/hive/warehouse/database_name.db/table_name 对于托管和外部 tables。

更新:根据 platform/vendor,位置可能会有一些限制,请参阅 ,您可能不允许在他们的外部创建 manged/external table默认允许的根位置。

另请参阅 Managed vs External Tables

上的官方 Hive 文档