2015-02-25 38 views
7

Ho un set di dati in BigQuery. Questo set di dati contiene più tabelle.BigQuery - Verifica se la tabella esiste già

sto facendo le seguenti fasi di programmazione utilizzando l'API di BigQuery:

  1. Interrogare le tabelle del set di dati - Dal momento che la mia risposta è troppo grande, sto consentendo parametro allowLargeResults e deviando la mia risposta a una tabella di destinazione .

  2. Sto quindi esportando i dati dalla tabella di destinazione in un bucket GCS.

Requisiti:

  • Supponiamo che il mio processo non riesce al punto 2, vorrei ri-eseguire questo passaggio.

  • Ma prima di eseguire nuovamente, vorrei verificare/verificare che la tabella di destinazione specifica denominata 'xyz' esista già nel set di dati.

  • Se esiste, vorrei eseguire nuovamente il punto 2.

  • Se esso non esiste, mi piacerebbe fare foo.

Come posso fare questo?

Grazie in anticipo.

+0

hai mai esaminato la disposizione di scrittura? puoi effettivamente fare qualcosa chiamato "write_if_empty", che blocca se ci sono QUALSIASI dati sulla tabella. Oppure "Write_truncate" che sostituirà i dati esistenti con quello attuale. – Patrice

+0

L'ho esaminato. Voglio verificare se la tabella esiste prima di esportare in GCS .. non prima di scrivere su una tabella di destinazione. Il parametro write disposition è disponibile solo quando si desidera caricare i dati in una tabella, eseguire una query su una tabella e copiare una tabella esistente. Ma non mentre si estrae a GCS. Questa era la mia comprensione Potrei sbagliarmi. qualche idea? – activelearner

+0

no no hai completamente ragione. La tua domanda mi è sembrata abbastanza ampia, quindi non ero sicuro al 100% di dove volessi cogliere il problema. Beh intendo .... stai usando quale lingua? : P Abbiamo bisogno di un po 'di carne per questa domanda per poterlo esaminare. C'è sicuramente un modo con l'API BigQuery per verificare se esiste una tabella ... – Patrice

risposta

7

Ecco un frammento di pitone che dirà se una tabella esiste:

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

In alternativa, se preferisci non eliminazione della tabella nel processo, si potrebbe provare:

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 

Se volete sapere dove bq venuto da, è possibile chiamare build_bq_client da qui: http://code.google.com/p/bigquery-e2e/source/browse/samples/ch12/auth.py

In generale, se si sta utilizzando t per verificare se è necessario eseguire un lavoro che modificherà la tabella, può essere una buona idea eseguire il lavoro in ogni caso e utilizzare WRITE_TRUNCATE come disposizione di scrittura.

Un altro approccio può essere quello di creare un ID lavoro prevedibile e ritentare il lavoro con quell'ID. Se il lavoro esiste già, il lavoro è già stato eseguito (si potrebbe voler ricontrollare per assicurarsi che il lavoro non abbia esito negativo, comunque).

+0

Grazie Jordan. Sono stato in grado di creare correttamente un oggetto client bq da credenziali valide. Usando bq, sono stato in grado di implementare la funzione doesTableExist. – activelearner

+0

404 potrebbe anche significare che la risorsa non è lì per un sacco di motivi, mentre l'utente penserebbe che la tabella semplicemente non esiste. Funziona adesso? Può essere. Dopo N anni di "lavoro", cerca di individuare l'errore. –

+0

se si dispone già di un client instanciato, esiste un metodo '.exists()'. Vedere la mia risposta a https://stackoverflow.com/a/47884257/92471 –

1

Godetevi:

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 

C'è una modifica in deroga.

0

Con my_bigquery essendo un'istanza della classe google.cloud.bigquery.Client (già sola autenticazione ed associato ad un progetto):

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

Si fa una chiamata API per verificare l'esistenza del tavolo tramite una richiesta GET

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

funziona per me usando 0.27 del modulo di Google BigQuery Python

+1

questa è rotta per google-cloud-bigquery == 0,28 –

0

La soluzione di Alex F funziona su v0.27, ma non funzionerà con le versioni successive. Al fine di migrate to v0.28+, la soluzione di seguito funzionerà.

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) 
Problemi correlati