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

Where is HIVE metadata stored by default?

我使用以下方法在 Hive 中创建了一个外部 table:

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';

现在这个 table 是在位置 */hive/external 中创建的。

第 1 步: 我在此 table 中加载数据使用:

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

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

第 2 步: 我使用以下方法从 */hive/external 路径中删除 table:

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

问题:

  1. 为什么 table 从原来的路径中删除了? (*/input/hpd.txt 从 hdfs 中删除,但 table 在 */external 路径中创建)
  2. 在我按照第 2 步从 HDFS 中删除 table 之后,我再次使用 show tables;它仍然在外部路径中给出 table hpd_txt 。 那么这是从哪里来的。

提前致谢。

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

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

例如上面的命令不会删除 table 它只是删除文件。 table 仍然存在于配置单元 Metastore 中。如果你想删除 table 然后使用:

drop if exists tablename;

由于您将 table 创建为外部 table,这将从配置单元中删除 table。如果您没有删除文件,这些文件将保留下来。如果要删除外部 table 和 table 正在读取的文件,您可以执行以下操作之一:

  1. 删除 table 然后删除文件
  2. 将 table 更改为托管并删除 table

最后,hive 元存储的位置默认位于此处 /usr/hive/warehouse

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

来源:Hive docs

因此,在您的第 2 步中,删除文件 /user/hive/external/hpd_txt 会删除数据源(指向 table 的数据),但 table 仍然存在并将继续指向hdfs://localhost:9000/user/hive/external 创建时的样子

@Anoop:不确定这是否回答了您的问题。如果您还有任何问题,请告诉我。

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

  2. 删除 table 不会从磁盘 中删除 HDFS 文件。这就是外部table的优势。 Hive tables 只是存储元数据以访问数据文件。 Hive tables 将数据文件的实际数据存储在HIVE tables 中。如果删除 table,HDFS 文件位置中的数据文件将保持不变。但是在内部 table 的情况下,如果您删除 table.

  3. ,元数据和数据都将被删除

通过您的帮助评论和其他帖子,我找到了问题的答案。 如果我使用 LOAD INPATH 命令,那么它 "moves" 源文件到创建外部 table 的位置。虽然在删除 table 的情况下不会受到影响,但更改位置并不好。因此,如果在 Internal tables 中加载数据,请使用本地 inpath。

要从位于 HDFS 中的文件加载外部 tables 中的数据,请使用 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 命令。

将源文件存储在它们的专用目录中是一种很好的做法。这样在创建外部 table 时就不会出现歧义,因为数据位于正确管理的目录系统中。

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