我在中创建了一个外部表 Hive
使用以下内容:
create external table hpd_txt(
WbanNum INT,
YearMonthDay INT ,
Time INT,
HourlyPrecip INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
stored as textfile
location 'hdfs://localhost:9000/user/hive/external';
现在这个表是在位置中创建的 */hive/external
.
步骤1:我使用以下方法将数据加载到此表中:
load data inpath '/input/hpd.txt' into table hpd_txt;
数据已成功加载到指定路径( */external/hpd_txt
)
步骤2:我从 */hive/external
路径使用以下内容:
hadoop fs -rmr /user/hive/external/hpd_txt
问题:
为什么要从原始路径中删除表( */input/hpd.txt
已从hdfs中删除,但表是在中创建的 */external
路径)
在我像第2步那样从hdfs中删除表之后,我再次使用show tables;它仍然在外部路径中提供表hpd泷u txt。那么这是从哪里来的呢。
提前谢谢。
4条答案
按热度按时间jtw3ybtb1#
hive不知道你删除了这些文件。配置单元仍希望在指定的位置找到文件。你可以在hdfs中做任何你想做的事情,而这不会被传送到hive。如果情况发生了变化,你必须告诉hive。
例如,上面的命令不会删除表,而只是删除文件。该表仍存在于配置单元元存储中。如果要删除该表,请使用:
由于已将表创建为外部表,因此将从配置单元中删除该表。如果您没有删除这些文件,它们将保留下来。如果要删除外部表及其读取的文件,可以执行以下操作之一:
删除表,然后删除文件
将表更改为托管并删除表
最后,配置单元的元存储的位置默认位于此处
/usr/hive/warehouse
.bttbmeg02#
external关键字允许您创建一个表并提供一个位置,以便配置单元不为此表使用默认位置。如果您已经生成了数据,那么这将非常方便。否则,您将加载数据(常规方式或通过在配置单元表所指向的目录中创建文件),在删除外部表时,表中的数据不会从文件系统中删除。外部表指向其存储的任何hdfs位置,而不是存储在配置属性hive.metastore.warehouse.dir指定的文件夹中。
来源:hive文档
因此,在步骤2中,删除文件/user/hive/external/hpd\u txt将删除数据源(指向表的数据),但表仍然存在并将继续指向hdfs://localhost:9000/user/hive/external
@不确定这是否回答了你的问题。如果你还有什么问题,请告诉我。
a7qyws3x3#
在浏览了你们的帮助评论和其他帖子之后,我找到了问题的答案。如果我使用loadinpath命令,那么它会将源文件“移动”到创建外部表的位置。这虽然不会受到影响的情况下,下降表,但改变位置是不好的。因此,在内部表中加载数据时使用localinpath。
要从hdfs中的文件加载外部表中的数据,请使用create table查询中的位置,该位置将指向源文件,例如:
所以这个示例位置将指向hdfs中已经存在的数据。所以这里不需要使用loadinpath命令。
将源文件存储在其专用目录中是一种很好的做法。因此,当外部表作为数据在正确管理的目录系统中创建时,不会出现歧义。
非常感谢你们帮我理解这个概念!干杯!
bz4sfanl4#
不要使用加载路径命令。加载操作用于将数据移动(而不是复制)到相应的配置单元表中。使用put或copyfromlocal将文件从非hdfs格式复制到hdfs格式。执行put命令后,只需在create表中提供hdfs文件位置。
删除表不会从磁盘中删除hdfs文件。这就是外部表的优点。配置单元表只存储元数据以访问数据文件。配置单元表在配置单元表中存储数据文件的实际数据。如果删除该表,则数据文件在hdfs文件位置中是不变的。但对于内部表,如果删除表,元数据和数据都将被删除。