2014-01-17 26 views
10

Ich verbinde mich mit Hive über einen ODBC-Treiber von einer .NET-Anwendung. Gibt es eine Abfrage, um festzustellen, ob eine Tabelle bereits existiert? In MSSQL können Sie beispielsweise die Tabelle INFORMATION_SCHEMA abfragen, und in Netezza können Sie die Tabelle _v_table abfragen.Wie überprüft man, ob eine Tabelle in Hive existiert?

Jede Hilfe wäre willkommen.

+0

Haben Sie irgendeine Forschung getan? – Kermit

+1

Ja, ich habe Nachforschungen angestellt und mir nichts einfallen lassen. Die einzige Lösung, die ich finden kann, besteht darin, zu versuchen, aus der Tabelle auszuwählen und die Ausnahme abzufangen. –

Antwort

8

Es gibt zwei Ansätze, mit denen Sie das überprüfen:

1.) Wie @dimamah vorgeschlagen, nur hier einen Punkt hinzuzufügen, für diesen Ansatz müssen Sie

1.1) start the **hiveserver** before running the query 
1.2) you have to run two queries 
     1.2.1) USE <database_name> 
     1.2.2) SHOW TABLES LIKE 'table_name' 
     1.2.3) Then you check your result using Result set. 

2.) Der zweite Ansatz besteht darin, HiveMetastoreClient APIs zu verwenden, wo Sie direkt die APIs verwenden können, um zu überprüfen, ob Tabellenname in einer bestimmten Datenbank vorhanden ist oder nicht.

Für weitere Hilfe gehen Sie bitte über diesen Hive 11

+0

Der Link für "Hive 11" ist jetzt defekt (404 Not Found).Wissen Sie, wo sich der aktualisierte Speicherort der Dokumentation befindet? Ich schaute auch auf dieses Dokument, aber scheint die Info dort ist begrenzt: https://cwiki.apache.org/confluence/display/Hive/Hive+APIs+Overview#HiveAPIsOverview-Metastore(Java) – leeyuiwah

8

Führen Sie den folgenden Befehl aus: show tables in DB like 'TABLENAME'
Wenn die Tabelle vorhanden ist, wird der Name zurückgegeben, andernfalls wird nichts zurückgegeben.
Dies geschieht direkt aus dem Stock. Weitere Optionen finden Sie unter this.

DB ist die Datenbank, in der Sie sehen möchten, ob die Tabelle existiert.
TABLENAME ist der Tabellenname Sie suchen,

Was passiert eigentlich, dass Hive seine metastore abfragt (auf Ihrer Konfiguration abhängig, aber es kann in einem Standard-RDBMS wie MySQL sein), so dass Sie kann wahlweise direkt auf den gleichen Metastore verbinden und schreibe deine eigene Abfrage, um zu sehen, ob die Tabelle existiert.

9

Bei der Programmierung auf Hive von Spark SQL können Sie folgende Methode verwenden, um zu überprüfen, ob Hive Tabelle vorhanden ist.

if (hiveContext.hql("SHOW TABLES LIKE '" + tableName + "'").collect().length == 1) { 

println(tableName + " exists") 

} 
+1

Spark ist Abwertung hql ... Wird diese Lösung mit einem regulären Hive-Kontext mit SQL funktionieren? Gibt es eine allgemeinere Spark-Methode zum Betrachten von Hive-Meta-Informationen, außer dem Ausführen einer Abfrage? –

+1

Auch - mit Spark 1.3.0, bekomme ich den folgenden Fehler: "Benutzerklasse warf Ausnahme: [1.13] Fehler:' 'in '' erwartet, aber Identifikator wie gefunden zeigen Tabellen wie 'Beispiel_Tabellen_Name';" Ich bekomme auch das Fehler, wenn ich "in " vor dem Tabellenname –

+1

Spark 1.5. Funktioniert auch mit sparkContext, nicht nur Hive Context. table_exists = len (sqlCtx.sql ("TABELLEN IN" + stg_db) .filter ("tabellenname = '% s'"% stg_tab) .collect()) == 1 – Tagar

2

Wenn jemand Shell-Skript wie mich verwendet, dann könnte meine Antwort nützlich sein. Angenommen, Ihre Tabelle befindet sich im Standardnamespace.

table=your_hive_table 
validateTable=$(hive --database default -e "SHOW TABLES LIKE '$table'") 
if [[ -z $validateTable ]]; then 
    echo "Error:: $table cannot be found" 
    exit 1 
fi 
+0

Aufgrund des HIVE-4364 Bugs funktioniert das nicht mit beeline immer wieder, +1 sowieso. – Tagar

2

Code ähnlich unter einem in viele meinen Spark-Notebooks finden:

stg_table_exists = sqlCtx.sql("SHOW TABLES IN "+ stg_db) 
        .filter("tableName='%s'" % stg_tab_name) .collect() 

(hergestellt Zweizeiler zur besseren Lesbarkeit)

ich Funken wünschen würden einen API-Aufruf müssen prüfen das Gleiche.

Verwandte Themen