2

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

 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 时,我可以看到 db 但depTable仓库内没有。

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

上面你可以看到这个数据库中没有创建表。据我所知,外部表不存储在配置单元仓库中。所以我正确吗??如果是,那么它存储在哪里?
但是如果我先创建外部表然后加载数据,那么我可以看到里面的文件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查询,我可以在数据库下看到这个表,如下所示:

[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  

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

[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  

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

4

1 回答 1

4

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

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

EXTERNAL表以及MANAGED存储在 DDL 中指定的位置。您可以在现有位置的顶部创建表格,其中数据文件已经在该位置,它适用于两者EXTERNALMANAGED,没关系。

您甚至可以在同一位置同时创建EXTERNAL和表,请参阅此答案以及更多详细信息和测试: https ://stackoverflow.com/a/54038932/2700344MANAGED

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

更新:根据平台/供应商,位置也可能有一些限制,请参阅https://stackoverflow.com/a/67073849/2700344,您可能不允许在默认允许的根位置之外创建管理/外部表。

另请参阅有关托管与外部表的官方 Hive 文档

于 2019-01-17T18:52:44.537 回答