2015-08-11 4 views
5

Stiamo caricando file csv in BigQuery. Ogni file creerà una tabella separata.BigQuery: TABLE_QUERY ma le colonne differiscono tra le tabelle

Quando selezioniamo da queste tabelle, lo facciamo per lo più con una tabella di query liek così:

SELECT foo, bar 
FROM TABLE_QUERY(name_stub,'table_id CONTAINS "_something" and msec_to_timestamp(creation_time) > date_add(current_timestamp(), -90, "day")')); 

Ora abbiamo aggiunto nuovi campi per i file più recenti. Quindi invece di avere solo campi "foo" e "bar" ora abbiamo anche "baz".

Quando si esegue la seguente query, viene visualizzato l'errore, che il campo "baz" non esiste in una delle tabelle precedenti.

SELECT foo, bar, baz 
FROM TABLE_QUERY(name_stub,'table_id CONTAINS "_something" and msec_to_timestamp(creation_time) > date_add(current_timestamp(), -90, "day")')); 

C'è un modo per selezionare "baz" e basta avere un valore predefinito per le tabelle che non hanno la colonna?

risposta

1

Aggiornamento: Questo problema è stato risolto.

BigQuery ora supporta TABLE_DATE_RANGE su tabelle in cui un sottoinsieme delle tabelle presenta uno schema più ampio. Le colonne mancanti dovrebbero apparire come NULL nelle tabelle in cui manca la colonna.

https://code.google.com/p/google-bigquery/issues/detail?id=439

+0

una grande notizia! esempio nel link sopra è abbastanza semplificato - questa copertina registra, ripetuta, ecc.? –

+0

Piuttosto interessante. Bello vedere questo indirizzato! –

2

L'aggiunta di nuove colonne a una tabella è possibile (tutti i dati storici avranno automaticamente NULL), ma si sta creando una nuova tabella ogni giorno - e TABLE_QUERY è solo una sintassi di collegamento per UNION. L'unica idea che ho è di creare una vista che aggiungerà la colonna "baz" alle vecchie tabelle. Quindi dovresti essere in grado di utilizzare TABLE_QUERY attraverso tali visualizzazioni e tabelle più recenti.

+0

molto bene, credo che l'approccio più pulito sarebbe quello di creare viste, grazie –

1

La soluzione alternativa è indicata nella risposta allo this question.

Nel mio caso, sarebbe stato:

SELECT foo, bar, coalesce(baz,0) 
FROM TABLE_DATE_RANGE(mydataset.le_table,<beginning of time>,<day before column add>), 
    TABLE_DATE_RANGE(mydataset.le_table,<day of column add>,<today>)