HIVE元数据默认存储在哪里



我在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

step1:

load data inpath '/input/hpd.txt' into table hpd_txt;

指定路径(*/external/hpd_txt)数据加载成功

step2:我从*/hive/external路径中删除表,使用以下命令:

hadoop fs -rmr /user/hive/external/hpd_txt

问题:

  1. 为什么表从原始路径中删除?(*/input/hpd.txt从hdfs中删除,但在*/external路径下创建表)
  2. 在我从HDFS删除表后,在步骤2中,我再次使用show tables;它仍然在外部路径中给出hpd_txt表。这是怎么来的?

Hive不知道你删除了文件。Hive仍然期望在您指定的位置找到文件。你可以在HDFS中做任何你想做的事情,这不会被传达给hive。如果情况有变,你得告诉蜂巢。

hadoop fs -rmr /user/hive/external/hpd_txt

例如,上面的命令不删除表,它只是删除文件。表仍然存在于hive metastore中。如果要删除表,请使用:

drop if exists tablename;

由于您将表创建为外部表,因此将从hive中删除表。如果您没有删除这些文件,它们将保留下来。如果您想删除外部表和表读取的文件,您可以执行以下操作之一:

  1. 删除表,然后删除文件
  2. 将表更改为managed并删除表

最后hive的metastore的位置默认在这里/usr/hive/warehouse .

EXTERNAL关键字允许您创建一个表并提供一个LOCATION,这样Hive就不会为这个表使用默认位置。如果您已经生成了数据,这将非常方便。否则,您将加载数据(通过常规方式或在hive表所指向的目录中创建一个文件)。删除EXTERNAL表时,表中的数据不会从文件系统中删除。EXTERNAL表指向其存储的任何HDFS位置,而不是存储在配置属性hive.metastore.warehouse.dir.

指定的文件夹中。

来源:Hive docs

所以,在你的步骤2中,删除文件/user/hive/external/hpd_txt删除了数据源(数据指向表),但表仍然存在,并将继续指向hdfs://localhost:9000/user/hive/external,因为它是创建的

@Anoop:不确定这是否回答了你的问题。

  1. 不要使用加载路径命令。Load操作用于将数据移动到对应的Hive表中,而不是将数据复制到对应的Hive表中。使用put或copyFromLocal将文件从非HDFS格式复制到HDFS格式。

  2. 在执行put命令后,在create table中提供HDFS文件的位置。
  3. 删除表不会从磁盘中删除HDFS文件。这就是外部表的优点。Hive表只是存储元数据来访问数据文件。Hive表将数据文件的实际数据存储在Hive表中。如果删除表,则数据文件在HDFS文件位置中不受影响。但是在内部表的情况下,如果你删除表,元数据和数据都将被删除。

看了你们的帮助评论和其他帖子后,我找到了我问题的答案。如果我使用LOAD INPATH命令,那么它将源文件"移动"到正在创建外部表的位置。虽然,不会受到影响的情况下掉表,但改变位置是不好的。因此,如果在内部表中加载数据,请使用本地inpath。

要从位于HDFS的文件中加载外部表中的数据,请使用CREATE table查询中的位置,该位置将指向源文件,例如:

create external table hpd(WbanNum string,
YearMonthDay string , 
Time string, 
hourprecip string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY 'n'
stored as textfile
location 'hdfs://localhost:9000/input/hpd/';

所以这个示例位置将指向这个路径中已经存在于HDFS中的数据。所以不需要在这里使用LOAD INPATH命令。

将源文件存储在它们的私有专用目录中是一个很好的做法。因此,在创建外部表时,没有歧义,因为数据是在一个适当管理的目录系统中创建的。

非常感谢帮助我理解这个概念的家伙!干杯!

最新更新