在Hive中,我们如何在所有数据库中按名称搜索表?
我是Teradata用户。是否存在系统表的对应物(存在于Teradata中),如dbc.tables,dbc.columns,它们存在于HIVE中?
答案 0 :(得分:6)
您可以使用SQL来搜索表格。 例: 我想搜索一个名称从" Benchmark"开始的表格。我不知道其余部分。
在HIVE CLI中输入:
show tables like 'ben*'
输出
+-----------------------+--+
| tab_name |
+-----------------------+--+
| benchmark_core_month |
| benchmark_core_qtr |
| benchmark_core_year |
+-----------------------+--+
3 rows selected (0.224 seconds)
如果您使用Beeline
,也可以尝试使用以下命令!tables
注意:它仅适用于Beeline(基于JDBC客户端)
更多关于beeline:http://blog.cloudera.com/blog/2014/02/migrating-from-hive-cli-to-beeline-a-primer/
答案 1 :(得分:4)
您还可以使用hdfs在所有数据库中查找表:
hive数据库的路径是:
/apps/hive/warehouse/
所以,使用hdfs:
hdfs dfs -find /apps/hive/warehouse/ -name t*
答案 2 :(得分:2)
您应该查询Metastore。
您可以在hive-site.xml
<强>的bash 强>
<$HIVE_HOME/conf/hive-site.xml grep -A1 jdo
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://127.0.0.1/metastore?createDatabaseIfNotExist=true</value>
--
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
--
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
--
<name>javax.jdo.option.ConnectionPassword</name>
<value>cloudera</value>
在Metastore中,您可以使用类似于以下内容的查询
<强> MySQL的强>
select *
from metastore.DBS as d
join metastore.TBLS as t
on t.DB_ID =
d.DB_ID
where t.TBL_NAME like '% ... put somthing here ... %'
order by d.NAME
,t.TBL_NAME
;
答案 3 :(得分:1)
@hisi的回答很优雅。但是,这会导致错误,因为我们的群集上的GC内存不足。因此,还有另一种不太适合我的方法。
让foo
是要搜索的表名。所以
hadoop fs -ls -R -C /apps/hive/warehouse/ 2>/dev/null | grep '/apps/hive/warehouse/[^/]\{1,\}/foo$'
如果一个人不记得表的确切名称,而只记得表名中的子字符串bar
,则命令为
hadoop fs -ls -R -C /apps/hive/warehouse/ 2>/dev/null | grep '/apps/hive/warehouse/[^/]\{1,\}/[^/]\{1,\}$' | grep bar
答案 4 :(得分:0)
Hive将所有元数据信息存储在Metastore中。 Metastore架构可在以下位置找到:link:https://issues.apache.org/jira/secure/attachment/12471108/HiveMetaStore.pdf
它有像数据库的DBS,表和列的TBLS这样的表。您可以使用适当的连接来查找表名或列名。
答案 5 :(得分:0)
在所有Hive数据库中搜索名称包含 infob 的表
for i in `hive -e "show schemas"`; do echo "Hive DB: $i"; hive -e "use $i; show tables"|grep "infob"; done
答案 6 :(得分:0)
这是Mantej Singh的回答:您可以使用pyspark在所有Hive数据库中查找表(不仅仅是一个):
from functools import reduce
from pyspark import SparkContext, HiveContext
from pyspark.sql import DataFrame
sc = SparkContext()
sqlContext = HiveContext(sc)
dbnames = [row.databaseName for row in sqlContext.sql('SHOW DATABASES').collect()]
tnames = []
for dbname in dbnames:
tnames.append(sqlContext.sql('SHOW TABLES IN {} LIKE "%your_pattern%"'.format(dbname)))
tables = reduce(DataFrame.union, tnames)
tables.show()
方法是遍历数据库,搜索具有指定名称的表。