1

如果您使用指向某个 S3 存储桶位置的EXTERNAL关键字创建外部表,我注意到了一件事。数据被加载,您可以查询它。但是,即使我不使用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';
4

2 回答 2

2

当您将Location托管表一起使用时,其目的是创建一个专用于该表的新目录,否则该目录将转到默认位置/user/hive/warehouse/。所以,当你这样做时:

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

它将为 table dummy创建一个名为s3n://logs/july的新目录,而不是在/user/hive/warehouse/中创建一个目录dummy

如果您将Location外部表一起用于不存在的位置,也会发生同样的事情。在创建外部表时,如果您提供一个存在的目录位置,那么该目录内的所有文件将共同构成该表的数据。如果目录不存在,那么您将看到与托管表相同的行为,即表将在与您在发出 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将保持原样,但为空白(因为您在创建表时已将其指向不存在的位置)。

如果您删除托管表,即使它是使用Location子句创建的,由 Location 表示的目录也会被删除。我不知道在这两种情况下你是如何得到相同的行为的。试试这个,让我知道你观察到了什么。

顺便说一句,SO 是一个用精神分享知识和思想的地方。并且不要变得过度或个人采取东西。如果您不同意某些观点,则有一种正确的方式来表达您的观点。如果只是投反对票,请告诉我。我会投票赞成你所有的问题和答案。

于 2013-07-13T01:23:34.083 回答
0

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

当您使用 Drop 命令时,外部表只会删除模式,而托管表甚至会删除数据。

外部表对于将日常跨国数据作为 sql 查询输出的一部分非常有用,无需任何额外的努力。

也读这个

于 2013-07-10T12:07:06.440 回答