搜索配置单元中所有数据库中的表

时间:2017-05-24 07:25:06

标签: hadoop hive hdfs hiveql

在Hive中,我们如何在所有数据库中按名称搜索表?

我是Teradata用户。是否存在系统表的对应物(存在于Teradata中),如dbc.tables,dbc.columns,它们存在于HIVE中?

7 个答案:

答案 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()

方法是遍历数据库,搜索具有指定名称的表。