在hive中创建表时EXTERNAL关键字的重要性

时间:2013-07-10 11:36:23

标签: hadoop amazon-s3 hive amazon-emr

如果您创建一个外部表,其中 EXTERNAL 关键字指向某个S3存储桶位置,我注意到了一件事。数据加载,您可以查询它。但是,即使我不使用 EXTERNAL 关键字并使用脚本的其余部分来创建表。即便如此,它也能完美运作为什么会这样?还有,它是外部桌子还是临时桌子?如果,我删除此表将删除元数据或数据?术语 EXTERNAL 有什么意义吗?

如果我使用EXTERNAL关键字和位置创建一个表,而另一个表没有EXTERNAL关键字但是有位置。当我得到相同的行为时,有什么区别?

create table dummy(id int, value string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
    STORED AS TEXTFILE
    LOCATION 's3n://logs/july';

                 VS

create external table dummy(id int, value string)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
        STORED AS TEXTFILE
        LOCATION 's3n://logs/july';

2 个答案:

答案 0 :(得分:2)

位置托管表一起使用时,其目的是创建一个专用于此表的新目录,否则该目录将转到默认位置 /用户/蜂巢/仓库/ 即可。所以,当你这样做时:

create table dummy(id int, value string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
    STORED AS TEXTFILE
    LOCATION 's3n://logs/july';

它将为表格虚拟创建一个名为 s3n:// logs / july 的新目录,而不是在内部创建目录虚拟 /用户/蜂巢/仓库/

如果您将位置外部表用于不存在的位置,则会发生同样的情况。如果您提供存在的目录位置,则创建外部表时,此目录中的所有文件将共同构成此表的数据。如果该目录不存在,那么您将看到与托管表相同的行为,即在发出create命令时,将在与您指定的位置相同的位置创建一个空白目录。说,你这样做:

create external table dummy(id int, value string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '~'
        STORED AS TEXTFILE
        LOCATION 's3n://logs/july';

如果 s3n:// logs / july 存在,那么将创建表 dummy ,其中的数据来自 s3n:// logs / july下的文件即可。如果 s3n:// logs / july 不存在,那么在发出create命令后,您将立即在同一位置看到一个全新的目录。如果删除此表,目录 s3n:// logs / july 将保持原样,但是空白(因为您在创建表时已将其指向不存在的位置)。

如果您删除托管表,即使它是使用位置子句创建的,“位置”所代表的目录也会已删除。在这两种情况下,我不知道你是如何得到同样的行为的。试试这个,让我知道你观察到了什么。

  顺便说一下,SO是一个与精神分享知识和思想的地方。和   不要超级或亲自拿东西。如果你不同意somehitng,有一个正确的方法来表明你的观点。如果它只是一个downvote,请告诉我。我会提出你所有的问题   答案。

答案 1 :(得分:0)

外部表示文件夹路径不是hive仓库(/usr/hive/warehouse)的一部分。

使用Drop命令时,外部表只删除模式, 托管表甚至丢弃数据的位置。

外部表非常有用,可以将日常跨国数据作为sql查询输出的一部分,而无需任何额外的工作。

read this also