2015-02-25 4 views
7

Ich habe einen Datensatz in BigQuery. Dieser Datensatz enthält mehrere Tabellen.BigQuery - Überprüfen, ob die Tabelle bereits existiert

Ich tue die folgenden Schritte programmatisch die BigQuery API:

  1. die Tabellen in der Datenmenge abfragen - Da meine Antwort zu groß ist, ich allowLargeResults Parameter bin ermöglicht und meine Antwort auf eine Zieltabelle Umleitung .

  2. Ich exportiere die Daten aus der Zieltabelle in einen GCS-Bucket.

Anforderungen:

  • mein fehlschlägt bei Schritt 2 Nehmen wir an, würde Ich mag diesen Schritt erneut ausführen.

  • Aber bevor ich neu starte, möchte ich überprüfen, ob die spezifische Zieltabelle mit dem Namen 'xyz' bereits im Datensatz existiert.

  • Wenn es vorhanden ist, möchte ich Schritt erneut ausführen 2.

  • Wenn es nicht vorhanden ist, ich möchte foo tun.

Wie kann ich das tun?

Vielen Dank im Voraus.

+0

Haben Sie jemals in die Disposition geschrieben? Sie können tatsächlich etwas tun, das "write_if_empty" genannt wird, das blockiert, wenn ALLE Daten auf der Tabelle sind. Oder "Write_truncate", die vorhandene Daten durch Ihre aktuelle ersetzt. – Patrice

+0

Ich habe es untersucht. Ich möchte überprüfen, ob die Tabelle vor dem Export in GCS .. nicht vor dem Schreiben in eine Zieltabelle vorhanden ist. Der Parameter write disposition ist nur verfügbar, wenn Sie Daten in eine Tabelle laden, eine Tabelle abfragen und eine vorhandene Tabelle kopieren möchten. Aber nicht beim Extrahieren in GCS. Das war mein Verständnis. Ich kann mich irren. Irgendwelche Gedanken? – activelearner

+0

nein nein du bist völlig richtig. Ihre Frage schien mir ziemlich breit zu sein, also war ich mir nicht 100% ig sicher, wo Sie das Problem haben wollten. Nun, ich meine .... Sie benutzen welche Sprache? : P Wir brauchen etwas Fleisch für diese Frage, um es untersuchen zu können. Es gibt definitiv eine Möglichkeit mit der BigQuery-API zu prüfen, ob eine Tabelle existiert ... – Patrice

Antwort

7

Hier ist ein Python-Schnipsel ist, ob eine Tabelle vorhanden sagen wird:

def doesTableExist(project_id, dataset_id, table_id): 
    bq.tables().delete(
     projectId=project_id, 
     datasetId=dataset_id, 
     tableId=table_id).execute() 
    return False 

Alternativ, wenn Sie nicht würde es vorziehen, um die Tabelle in dem Prozess zum Löschen, könnten Sie versuchen:

def doesTableExist(project_id, dataset_id, table_id): 
    try: 
    bq.tables().get(
     projectId=project_id, 
     datasetId=dataset_id, 
     tableId=table_id).execute() 
    return True 
    except HttpError, err 
    if err.resp.status <> 404: 
     raise 
    return False 

Wenn Sie wissen möchten, woher bq stammt, können Sie build_bq_client von hier anrufen: http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py

Im Allgemeinen, wenn Sie t verwenden Um zu testen, ob Sie einen Job ausführen sollten, der die Tabelle ändert, kann es eine gute Idee sein, den Job trotzdem auszuführen und WRITE_TRUNCATE als eine Schreibdisposition zu verwenden.

Ein anderer Ansatz kann darin bestehen, eine vorhersehbare Job-ID zu erstellen und den Job mit dieser ID erneut zu versuchen. Wenn der Job bereits vorhanden ist, wurde der Job bereits ausgeführt (Sie sollten jedoch überprüfen, ob der Job nicht fehlgeschlagen ist).

+0

Danke Jordan. Ich war in der Lage, ein bq Klientenobjekt erfolgreich von den gültigen Anerkennungen zu errichten. Mit bq konnte ich die Funktion doesTableExist implementieren. – activelearner

+0

404 könnte auch bedeuten, dass die Ressource aus einer Reihe von Gründen nicht da ist, während der Benutzer denken würde, dass die Tabelle einfach nicht existiert. Arbeitet jetzt? Könnte sein. Nach N Jahren "arbeiten" versuchen, den Fehler zu erkennen. –

+0

Wenn Sie bereits einen Client installiert haben, gibt es eine '.exists()' Methode. Siehe meine Antwort unter https://stackoverflow.com/a/47884257/92471 –

1

Enjoy:

def doesTableExist(bigquery, project_id, dataset_id, table_id): 
    try: 
     bigquery.tables().get(
      projectId=project_id, 
      datasetId=dataset_id, 
      tableId=table_id).execute() 
     return True 
    except Exception as err: 
     if err.resp.status != 404: 
      raise 
     return False 

Es eine Bearbeitung in Ausnahme.

0

Mit my_bigquery eine Instanz der Klasse zu sein google.cloud.bigquery.Client (bereits authentifizierte und zu einem Projekt zugeordnet ist):

my_bigquery.dataset(dataset_name).table(table_name).exists() # returns boolean 

Es tut einen API-Aufruf für die Existenz der Tabelle über eine GET-Anfrage zu testen

Quelle: https://googlecloudplatform.github.io/google-cloud-python/0.24.0/bigquery-table.html#google.cloud.bigquery.table.Table.exists

Es funktioniert für mich 0.27 des Google BigQuery Python-Modul mit

+1

Dies ist für google-cloud-bigquery == 0.28 gebrochen –

0

Die Lösung von Alex F funktioniert auf Version 0.27, wird aber in späteren Versionen nicht funktionieren. Um zu migrate to v0.28+, wird die folgende Lösung funktionieren.

from google.cloud import bigquery 

project_nm = 'gc_project_nm' 
dataset_nm = 'ds_nm' 
table_nm = 'tbl_nm' 

client = bigquery.Client(project_nm) 
dataset = client.dataset(dataset_nm) 
table_ref = dataset.table(table_nm) 

def if_tbl_exists(client, table_ref): 
    from google.cloud.exceptions import NotFound 
    try: 
     client.get_table(table_ref) 
     return True 
    except NotFound: 
     return False 

if_tbl_exists(client, table_ref)