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?
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/
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*
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
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.