我想知道如何找到Hive表与它们所代表的实际HDFS文件(或更确切地说,目录)之间的映射。我需要直接访问表文件。
Hive将文件存储在HDFS中的哪个位置?
答案 0 :(得分:52)
一旦知道要查看的位置,它们存储在HDFS上的位置就很容易识别出来。 :)
如果您在浏览器中转到http://NAMENODE_MACHINE_NAME:50070/
,则会转到带有Browse the filesystem
链接的网页。
在$HIVE_HOME/conf
目录中,hive-default.xml
和/或hive-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
中描述了端口更改的完整列表答案 1 :(得分:52)
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>
。
答案 2 :(得分:24)
在Hive终端类型中:
hive> set hive.metastore.warehouse.dir;
(它将打印路径)
答案 3 :(得分:5)
在hive cli中输入show create table <table_name>
也很有可能为您提供蜂巢表的确切位置。
答案 4 :(得分:3)
describe formatted <table_name>;
。
注意&#34;位置&#34;显示表格位置的值。
答案 5 :(得分:3)
总结前面发布的几点, 在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
下测试答案 6 :(得分:2)
Hive表存储在Hive仓库目录中。 默认情况下,MapR将Hive仓库目录配置为根卷下的 / user / hive / warehouse 。此默认值在 $ HIVE_HOME / conf / hive-default.xml中定义。
答案 7 :(得分: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表有关的数据的位置。
答案 8 :(得分:0)
在Hive中,表实际上存储在几个地方。具体来说,如果您使用分区(如果您的表非常大或正在增长,则应该使用分区),那么每个分区都可以拥有自己的存储。
要显示通过默认HIVE命令创建表数据或分区的默认位置:(insert overwrite ... partition ...
等):
describe formatted dbname.tablename
要显示HIVE表中特定分区的实际位置,请执行以下操作:
describe formatted dbname.tablename partition (name=value)
如果你在文件系统中查看表格&#34;应该&#34;实时,并且您在那里找不到文件,很可能通过创建新分区并将该分区指向其他位置来创建表(通常是递增地)。这是一种很好的方法,可以从日常从第三方导入的东西等构建表格,这样就可以避免复制文件或在不同的地方多次存储它们。
答案 9 :(得分:0)
另一种检查特定表存储位置的方法是在 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')
上面示例中的位置是您应该关注的地方。这是hive仓库的hdfs位置。
如果你喜欢这个解决方案,别忘了喜欢。干杯!的
答案 10 :(得分:0)
在沙箱中,您需要使用/ apps / hive / warehouse /和普通集群/ user / hive / warehouse
答案 11 :(得分:0)
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数据库目录下。