wake-up-neo.com

Durchsuchen Sie eine Tabelle in allen Datenbanken in hive

Wie durchsuchen Sie in Hive eine Tabelle in allen Datenbanken nach Namen?

Ich bin Teradata-Benutzer. Gibt es ein Gegenstück zu Systemtabellen (in Teradata) wie dbc.tables, dbc.columns, die in HIVE vorhanden sind?

6
v83rahul

Sie sollten den Metastore abfragen.

Sie finden die Verbindungseigenschaften in 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>

Innerhalb des Metastores können Sie eine Abfrage ähnlich der folgenden verwenden

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                                          
;

Sie können SQL gerne verwenden, um eine Tabelle zu durchsuchen. __ Beispiel: Ich möchte eine Tabelle mit dem Namen ab "Benchmark" suchen. Ich kenne den Rest nicht.

Eingabe in Hive-CLI:

show tables like 'ben*'

Ausgabe: 

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

Oder Sie können den folgenden Befehl ausprobieren, wenn Sie Beeline verwenden

!tables

Hinweis: Es funktioniert nur mit Beeline (JDBC-Client-basiert).

Mehr zu beeline: http://blog.cloudera.com/blog/2014/02/migrating-from-Hive-cli-to-beeline-a-primer/

6
Mantej Singh

sie können auch HDFS verwenden, um eine Tabelle in allen Datenbanken zu finden:

der Pfad der Hive-Datenbanken lautet:

/apps/Hive/warehouse/

also mit hdfs:

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

@ hisis Antwort ist elegant. Es führt jedoch zu einem Fehler mit fehlendem Speicher für GC in unserem Cluster. Es gibt also einen anderen, weniger eleganten Ansatz, der für mich funktioniert.

Sei foo der zu durchsuchende Tabellenname. So

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

Wenn man sich nicht an den genauen Namen der Tabelle erinnert, sondern nur den Teilstring bar im Tabellennamen, dann lautet der Befehl

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

Hive speichert alle Metadateninformationen in Metastore. Das Metastore-Schema finden Sie unter: link: https://issues.Apache.org/jira/secure/attachment/12471108/HiveMetaStore.pdf

Es hat Tabellen wie DBS für Datenbank, TBLS für Tabellen und Spalten. Sie können den entsprechenden Join verwenden, um Tabellennamen oder Spaltennamen herauszufinden.

0
Avi C

Suchen nach Tabellen mit Namen, die Folgendes enthalten infob in allen Hive-Datenbanken

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