默认情况下,HIVE元数据存储在哪里?

时间:2015-09-04 17:09:26

标签: hadoop hive hdfs

我使用以下内容在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

问题:

  1. 为什么从原始路径中删除表? (*/input/hpd.txt已从hdfs中删除,但表已在*/external路径中创建)
  2. 从第2步中删除HDFS中的表后,再次使用show tables;它仍然在外部路径中提供表hpd_txt。 那么这是从哪里来的。
  3. 提前致谢。

4 个答案:

答案 0 :(得分:1)

Hive不知道您删除了这些文件。 Hive仍然希望在您指定的位置找到文件。您可以在HDFS中执行任何操作,但这不会传达给配置单元。如果事情发生变化,你必须告诉蜂巢。

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

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

drop if exists tablename;

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

  1. 删除表格,然后删除文件
  2. 将表格更改为托管并删除表格
  3. 最后,hive的Metastore的位置默认位于/usr/hive/warehouse

答案 1 :(得分:0)

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:不确定这是否能回答你的问题。如果您有任何疑问,请与我联系。

答案 2 :(得分:0)

  1. 请勿使用加载路径命令。加载操作用于将数据移动(不复制)到相应的Hive表中。使用put或copyFromLocal将文件从非HDFS格式复制到HDFS格式。只需在执行put命令后在create table中提供HDFS文件位置。

  2. 删除表不会从磁盘中删除HDFS文件。这是外部表的优点。 Hive表只存储元数据以访问数据文件。 Hive表将数据文件的实际数据存储在HIVE表中。如果删除表,则数据文件在HDFS文件位置不受影响。但是在内部表格的情况下,如果删除表格,将删除元数据和数据。

答案 3 :(得分:0)

在通过您帮助评论和其他帖子后,我找到了回答我的问题。 如果我使用LOAD INPATH命令,则它将源文件“移动”到创建外部表的位置。虽然,在丢桌的情况下不会受到影响,但改变位置并不好。因此,如果在内部表中加载数据,请使用local inpath。

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

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命令。<​​/ p>

将源文件存储在其专用专用目录中是一种很好的做法。因此,在创建外部表时没有歧义,因为数据位于正确管理的目录系统中。

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

相关问题