与蜂巢中的外部表混淆

时间:2019-01-17 17:15:16

标签: hadoop hive

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

 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 ~]$ 

上面您可以看到此数据库中没有创建表。据我所知,外部表没有存储在配置单元仓库中。如果是,那么它将存储在哪里?
但是,如果我先创建外部表然后加载数据,则可以看到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  

那么,外部表的确切行为是什么?当我使用LOCATION关键字创建文件时,将其存储在哪里,当我使用load语句创建语句时,为什么将其存储在HDFS中,以及删除后为什么不将其删除。

1 个答案:

答案 0 :(得分:2)

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

EXTERNAL表和MANAGED被存储在DDL中指定的位置。您可以在现有位置的顶部创建表,并在该位置已有数据文件,该表将对EXTERNALMANAGED均适用,这无关紧要。

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

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

另请参见Managed vs External Tables上的Hive官方文档