web-dev-qa-db-fra.com

Rechercher une table dans toutes les bases de données de la ruche

Dans Hive, comment pouvons-nous rechercher une table par nom dans toutes les bases de données?

Je suis un utilisateur de Teradata. Existe-t-il une contrepartie des tables systèmes (présentes dans Teradata) telles que dbc.tables, dbc.columns présentes dans HIVE?

6
v83rahul

Vous devriez interroger le métastore.

Vous pouvez trouver les propriétés de connexion dans 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>

Dans le métastore, vous pouvez utiliser une requête semblable à la suivante

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                                          
;

Vous pouvez utiliser SQL comme pour chercher dans une table . Exemple: Je veux chercher une table dont le nom commence par "Benchmark" Je ne connais pas le reste.

Entrée dans l'interface CLI Hive:

show tables like 'ben*'

Sortie: 

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

Ou vous pouvez essayer la commande ci-dessous si vous utilisez Beeline

!tables

Remarque: cela fonctionnera uniquement avec Beeline (basé sur le client JDBC)

En savoir plus sur beeline: http://blog.cloudera.com/blog/2014/02/migrating-from-Hive-cli-to-beeline-a-primer/

6
Mantej Singh

vous pouvez également utiliser hdfs pour trouver une table dans toutes les bases de données:

le chemin des bases de données Hive est:

/apps/Hive/warehouse/

alors, en utilisant hdfs:

hdfs dfs -find /apps/Hive/warehouse/ -name t*
2
HISI

La réponse de @ hisi est élégante. Cependant, cela induit une erreur avec un manque de mémoire pour GC sur notre cluster. Il existe donc une autre approche moins élégante qui fonctionne pour moi.

Soit foo le nom de la table à rechercher. Alors

hadoop fs -ls -R -C /apps/Hive/warehouse/ 2>/dev/null | grep '/apps/Hive/warehouse/[^/]\{1,\}/foo$'

Si on ne se souvient pas du nom exact de la table mais seulement de la sous-chaîne bar dans le nom de la table, alors commande est

hadoop fs -ls -R -C /apps/Hive/warehouse/ 2>/dev/null | grep '/apps/Hive/warehouse/[^/]\{1,\}/[^/]\{1,\}$' | grep bar
1
Oleg Svechkarenko

Hive stocke toutes ses métadonnées dans Metastore. Le schéma Metastore est disponible à l’adresse suivante: link: https://issues.Apache.org/jira/secure/attachment/12471108/HiveMetaStore.pdf

Il a des tables comme DBS pour la base de données, TBLS pour les tables et les colonnes. Vous pouvez utiliser une jointure appropriée pour connaître le nom de la table ou les noms des colonnes.

0
Avi C