76

我想知道如何找到 Hive 表和它们所代表的实际 HDFS 文件(或者更确切地说是目录)之间的映射。我需要直接访问表文件。

Hive 将其文件存储在 HDFS 的什么位置?

4

12 回答 12

61

Hive 表不一定存储在仓库中(因为您可以创建位于 HDFS 上任何位置的表)。

你应该使用DESCRIBE FORMATTED <table_name>命令。

hive -S -e "describe formatted <table_name> ;" | grep 'Location' | awk '{ print $NF }'

请注意,分区可能存储在不同的位置,要获取alpha=foo/beta=bar分区的位置,您必须partition(alpha='foo',beta='bar')<table_name>.

于 2012-05-02T11:17:51.390 回答
59

一旦您知道在哪里查找,就很容易找出它们存储在 HDFS 上的位置。:)

如果您http://NAMENODE_MACHINE_NAME:50070/在浏览器中访问,它应该会将您带到带有Browse the filesystem链接的页面。

$HIVE_HOME/conf目录中有hive-default.xmland/orhive-site.xml具有该hive.metastore.warehouse.dir属性。该值是您在单击链接后要导航到的位置Browse the filesystem

在我的,它是/usr/hive/warehouse. 导航到该位置后,我会看到我的表的名称。单击表名(只是一个文件夹)将显示该表的分区。就我而言,我目前只在date. 当我单击此级别的文件夹时,我将看到文件(更多分区将具有更多级别)。这些文件是数据实际存储在 HDFS 上的位置。

我没有尝试直接访问这些文件,我假设它可以完成。如果您正在考虑编辑它们,我会非常小心。:) 对我来说 - 我会想办法在不直接访问磁盘上的 Hive 数据的情况下做我需要做的事情。如果您需要访问原始数据,可以使用 Hive 查询并将结果输出到文件。这些将具有与HDFS. 我一直在做这样的查询并将它们转换为 CSV。

关于如何将查询中的数据写入磁盘的部分是https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-Writingdataintothefilesystemfromqueries

更新

自 Hadoop 3.0.0 - Alpha 1 以来,默认端口号发生了变化。NAMENODE_MACHINE_NAME:50070 更改为 NAMENODE_MACHINE_NAME:9870。如果您在 Hadoop 3.x 上运行,请使用后者。HDFS-9427中描述了端口更改的完整列表

于 2011-03-01T05:45:03.590 回答
26

在 Hive 终端类型中:

hive> set hive.metastore.warehouse.dir;

(它将打印路径)

于 2013-08-02T23:37:04.823 回答
6

输入 hive cli 也很可能show create table <table_name>会为您提供 hive 表的确切位置。

于 2014-07-30T20:58:16.163 回答
5

总结一下之前贴的几点,在hive-site.xml中,属性hive.metastore.warehouse.dir指定了hadoop HDFS下文件的位置

<property>
   <name>hive.metastore.warehouse.dir</name>
   <value>/user/hive/warehouse</value>
</property>

要查看文件,请使用以下命令:

hadoop fs -ls /user/hive/warehouse

或者

http://localhost:50070
Utilities > Browse the file system
or
http://localhost:50070/explorer.html#/

在 hadoop-2.7.3、hive-2.1.1 下测试

于 2017-07-11T03:24:13.157 回答
4

describe formatted <table_name>;蜂巢壳内。

请注意显示表格位置的“位置”值。

于 2015-03-23T23:53:03.597 回答
3

Hive 表存储在 Hive 仓库目录中。默认情况下,MapR 将 Hive 仓库目录配置为根卷下的/user/hive/warehouse 。此默认值在$HIVE_HOME/conf/hive-default.xml 中定义。

于 2020-01-25T13:02:17.963 回答
2

检查特定表的存储位置的另一种方法是在hive 交互式界面上执行此查询:

show create table table_name;

其中table_name是主题表的名称。

上面对“客户”表的查询的示例如下:

CREATE TABLE `customers`(
  `id` string, 
  `name` string)
COMMENT 'Imported by sqoop on 2016/03/01 13:01:49'
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  LINES TERMINATED BY '\n' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://quickstart.cloudera:8020/user/hive/warehouse/
   sqoop_workspace.db/customers'
TBLPROPERTIES (
  'COLUMN_STATS_ACCURATE'='true', 
  'numFiles'='4', 
  'totalSize'='77', 
  'transient_lastDdlTime'='1456866115')

上面示例中的LOCATION是您应该关注的地方。那是您用于 hive 仓库的 hdfs 位置。

如果您喜欢此解决方案,请不要忘记喜欢。干杯!

于 2018-03-14T22:23:49.577 回答
2

Hive 数据库只不过是 HDFS 中带有 .db 扩展名的目录。

因此,从连接到 HDFS 的 Unix 或 Linux 主机,根据 HDFS 分布的类型进行以下搜索:

hdfs dfs -ls -R / 2>/dev/null|grep db 或者 hadoop fs -ls -R / 2>/dev/null|grep db

您将看到 .db 数据库目录的完整路径。所有表都将驻留在各自的 .db 数据库目录下。

于 2019-02-09T04:32:00.400 回答
1

在 Sandbox 中,您需要使用/apps/hive/warehouse/普通集群/user/hive/warehouse

于 2018-11-12T08:59:46.807 回答
0

如果您查看 hive-site.xml 文件,您会看到类似这样的内容

<property>
   <name>hive.metastore.warehouse.dir</name>
   <value>/usr/hive/warehouse </value>
   <description>location of the warehouse directory</description>
 </property>

/usr/hive/warehouse 是所有托管表的默认位置。外部表可能存储在不同的位置。

describe formatted <table_name>是 hive shell 命令,可以更普遍地用于查找与 hive 表有关的数据的位置。

于 2015-05-23T01:47:22.400 回答
0

在 Hive 中,表实际上存储在几个地方。具体来说,如果您使用分区(如果您的表非常大或正在增长,您应该这样做),那么每个分区都可以拥有自己的存储空间。

如果您通过默认 HIVE 命令创建表数据或分区,则显示默认位置:(insert overwrite ... partition ...等等):

describe formatted dbname.tablename

要显示 HIVE 表中特定分区的实际位置,请执行以下操作:

describe formatted dbname.tablename partition (name=value)

如果您查看表“应该”存在的文件系统,但在那里没有发现任何文件,则很可能是通过创建新分区并将该分区指向其他位置来创建表(通常是增量)。这是一种从第三方每日导入等内容构建表格的好方法,避免了复制文件或将它们多次存储在不同的地方。

于 2017-02-23T17:35:40.857 回答