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

标签 hadoop hive create-table external-tables hiveddl

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

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

在上面你可以看到这个数据库中没有创建表。据我所知,外部表没有存储在 hive 仓库中。所以我是对的吗??如果是,那么它存储在哪里??
但是,如果我先创建外部表然后加载数据,那么我就可以在 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 中以及删除后为什么它没有被删除。

最佳答案

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

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

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

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

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

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

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

关于hadoop - 与配置单元中的外部表混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54241071/

相关文章:

hadoop - 如何在级联中强制 reducer ?

java - hive :Kryo 异常

hadoop - 验证 Hive 单查询和多查询并行性

mysql - 创建表 mySQL 语法错误

sql - 数据步骤中的字符长度与 proc sql

hadoop - hadoop存储目录未正确指向

hadoop - hive.groupby.skewindata 依赖于 hive.optimize.skewjoin 吗?

hadoop命令在节点中查找namenode

java - 将附加参数传递给 R 中 JDBCDriver 的 dbConnect 函数

database - "DROP SCHEMA public"后无法创建新表