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

yr9zkbsy  于 2021-06-01  发布在  Hadoop
关注(0)|答案(7)|浏览(335)

在hive中,如何在所有数据库中按名称搜索表?
我是teradata用户。是否有系统表(在teradata中)的对应项,如hive中的dbc.tables、dbc.columns?

tvz2xvvm

tvz2xvvm1#

也可以使用hdfs在所有数据库中查找表:
配置单元数据库的路径是:

/apps/hive/warehouse/

因此,通过使用hdfs:

hdfs dfs -find /apps/hive/warehouse/ -name t*
kzmpq1sx

kzmpq1sx2#

您可以像使用sql一样搜索表。示例:我想搜索一个名称以“benchmark”开头的表,我不知道它的其余部分。
在配置单元cli中输入:

show tables like 'ben*'

输出:

+-----------------------+--+
|       tab_name        |
+-----------------------+--+
| benchmark_core_month  |
| benchmark_core_qtr    |
| benchmark_core_year   |
+-----------------------+--+
3 rows selected (0.224 seconds)

或者你可以尝试下面的命令,如果你使用的是直线

!tables

注意:它只适用于beeline(基于jdbc客户端)
有关beeline的更多信息:http://blog.cloudera.com/blog/2014/02/migrating-from-hive-cli-to-beeline-a-primer/

7ajki6be

7ajki6be3#

在所有配置单元数据库中搜索名为包含infob的表

for i in `hive -e "show schemas"`; do echo "Hive DB: $i"; hive -e "use $i; show tables"|grep "infob"; done
c3frrgcw

c3frrgcw4#

您应该查询元存储。
您可以在中找到连接属性 hive-site.xml 猛击

<$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                                          
;
h43kikqp

h43kikqp5#

配置单元将其所有元数据信息存储在metastore中。元存储架构可在以下位置找到:链接:https://issues.apache.org/jira/secure/attachment/12471108/hivemetastore.pdf
它有一些表,比如数据库的dbs,表和列的tbls。您可以使用适当的联接来查找表名或列名。

jjhzyzn0

jjhzyzn06#

这是mantej singh答案的扩展:您可以使用pyspark在所有配置单元数据库(而不仅仅是一个)中查找表:

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

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

apeeds0o

apeeds0o7#

@希希的回答很优雅。然而,它导致了一个错误,在我们的集群上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

相关问题