2015-02-25 23 views
7

Mam zestaw danych w BigQuery. Ten zbiór danych zawiera wiele tabel.BigQuery - Sprawdź, czy tabela już istnieje

robie następujące kroki programowo za pomocą interfejsu API BigQuery:

  1. odpytywanie tabel w zbiorze - Ponieważ moja odpowiedź jest zbyt duża, ja umożliwiając parametr allowLargeResults i przekazywania moją odpowiedź do tabeli docelowej .

  2. Następnie eksportuję dane z tabeli docelowej do zasobnika GCS.

Wymagania:

  • że moja proces nie powiedzie się w kroku 2, chciałbym ponownie uruchomić ten krok.

  • Ale zanim ponownie uruchomię, chciałbym sprawdzić/sprawdzić, czy konkretna tabela docelowa o nazwie "xyz" już istnieje w zestawie danych.

  • Jeżeli istnieje, chciałbym ponownie uruchomić Krok 2.

  • Jeśli nie istnieje, chciałbym zrobić foo.

Jak mogę to zrobić?

Z góry dziękuję.

+0

Czy kiedykolwiek sprawdzałeś dyspozycję dotyczącą pisania? możesz zrobić coś, co nazywa się "write_if_empty", co blokuje, jeśli w tabeli są DOWOLNE dane. Lub "Write_truncate", która zastąpi istniejące dane bieżącym. – Patrice

+0

Spojrzałem na to. Chcę sprawdzić, czy tabela istnieje przed eksportowaniem do GCS, a nie przed zapisaniem do tabeli docelowej. Parametr dyspozycja zapisu jest dostępny tylko wtedy, gdy chcesz załadować dane do tabeli, zapytać o tabelę i skopiować istniejącą tabelę. Ale nie podczas wyodrębniania do GCS. To było moje zrozumienie. Mogę się mylić. jakieś pomysły? – activelearner

+0

nie, nie masz racji. Twoje pytanie wydawało się dość szerokie, więc nie byłem w 100% pewny, gdzie chciałeś złapać problem. Mam na myśli ... używasz jakiego języka? : P Potrzebujemy trochę mięsa na to pytanie, abyśmy mogli się temu przyjrzeć. Z interfejsem API BigQuery jest na pewno sposób sprawdzenia, czy istnieje tabela ... – Patrice

Odpowiedz

7

Oto urywek pyton który pokaże, czy tabela istnieje:

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

Naprzemiennie jeśli wolisz nie usuwając tabelę w procesie, można spróbować:

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 

Jeśli chcesz się dowiedzieć, skąd pochodzi bq, możesz zadzwonić pod numer build_bq_client: http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py

Ogólnie, jeśli używasz aby sprawdzić, czy należy uruchomić zadanie, które zmodyfikuje tabelę, dobrze jest po prostu wykonać to zadanie i użyć WRITE_TRUNCATE jako dyspozycji do pisania.

Innym podejściem może być utworzenie przewidywalnego identyfikatora zadania i ponowienie zadania z tym identyfikatorem. Jeśli zadanie już istnieje, zadanie już zostało uruchomione (możesz jednak sprawdzić, czy zadanie nie zawiodło).

+0

Dziękuję Jordan. Udało mi się pomyślnie zbudować obiekt klienta bq z prawidłowych poświadczeń. Używając bq, byłem w stanie zaimplementować funkcję doTableExist. – activelearner

+0

404 może również oznaczać, że zasób nie istnieje z kilku powodów, a użytkownik pomyśli, że tabela po prostu nie istnieje. Działa teraz? Może. Po N latach "pracy" spróbuj dostrzec błąd. –

+0

jeśli masz już klienta anali towanego, istnieje metoda '.exists()'. Zobacz moją odpowiedź na 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 

Jest edit w wyjątku.

0

Z my_bigquery jest instancją klasy google.cloud.bigquery.Client (już autoryzacji z i związane z projektem):

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

Czyni wywołanie API, aby przetestować na istnienie tabeli poprzez żądanie GET

Źródło: https://googlecloudplatform.github.io/google-cloud-python/0.24.0/bigquery-table.html#google.cloud.bigquery.table.Table.exists

to działa na mnie za pomocą 0,27 modułu Google BigQuery Python

+1

to jest zepsute dla google-cloud-bigquery == 0.28 –

0

Rozwiązanie Alexa F działa na v0.27, ale nie będzie działać w późniejszych wersjach. Aby uzyskać migrate to v0.28+, poniższe rozwiązanie zadziała.