2016-04-28 26 views
5

Sto provando a interrogare più tabelle da un set di dati in Big Query usando dplyr e bigrquery. Il set di dati contiene più tabelle, una per ogni giorno di dati in un anno. Posso interrogare da una singola tabella (ad es. 1 giorno di dati) con il seguente codice ma non riesco a farlo funzionare su più tabelle contemporaneamente (ad es. Per un mese o un anno di dati). Qualsiasi aiuto sarebbe molto apprezzato.Come selezionare da più tabelle all'interno di un set di dati in Big Query usando dplyr e bigrquery?

connection <- src_bigquery("my_project", "dataset1") 
first_day <- connection %>% 
    tbl("20150101") %>% 
    select(field1) %>% 
    group_by(field1) %>% 
    summarise(number = n()) %>% 
    arrange(desc(number)) 

Grazie,

Juan

risposta

0

Cosa succede ad usare il comando 'list_tabledata' in 'bigrquery'?
Ho testato questo pezzo di codice con la stessa notazione di te e l'output è come molti file .RData nella directory di lavoro come giorni nell'intervallo di date.

library(bigrquery)  
project<-"my_project"  
dataset<-"dataset1"  
day<-seq(from=as.Date("20150101",format="%Y%m%d"),to=as.Date("20150131",format="%Y%m%d"),by="days")  
for (i in seq_along(day))  
    {  
     t<-list_tabledata(project,dataset,gsub("-","",as.character(day[i])),max_pages=Inf)  
     save(t,file=paste(gsub("-","",as.character(day[i])),".RData"))  
    }  

Spero che funzioni!
Lourdes Hernández

1

Per quanto ne so non c'è alcun supporto per table wildcard functions in dplyr e bigrquery al momento. Se non temi i brutti hack puoi comunque estrarre e modificare la query che dplyr costruisce e invia a bq in modo che punti a diverse tabelle invece di una sola.

Impostare le informazioni di fatturazione e connettersi al BigQuery:

my_billing <- ########## 
bq_db <- src_bigquery(
    project = "bigquery-public-data", 
    dataset = "noaa_gsod", 
    billing = my_billing 
) 
gsod <- tbl(bq_db, "gsod1929") 

Come selezionare da una tabella (solo per il confronto):

gsod %>% 
    filter(stn == "030750") %>% 
    select(year, mo, da, temp) %>% 
    collect 
Source: local data frame [92 x 4] 

    year mo da temp 
    (chr) (chr) (chr) (dbl) 
1 1929 10 01 45.2 
2 1929 10 02 49.2 
3 1929 10 03 48.2 
4 1929 10 04 43.5 
5 1929 10 05 42.0 
6 1929 10 06 51.0 
7 1929 10 07 48.0 
8 1929 10 08 43.7 
9 1929 10 09 45.1 
10 1929 10 10 51.3 
.. ... ... ... ... 

Come selezionare da più tabelle da manualmente modifica della query generata da dplyr:

multi_query <- gsod %>% 
    filter(stn == "030750") %>% 
    select(year, mo, da, temp) %>% 
    dplyr:::build_query(.) 

multi_tables <- paste("[bigquery-public-data:noaa_gsod.gsod", c(1929, 1930), "]", 
         sep = "", collapse = ", ") 

query_exec(
    query = gsub("\\[gsod1929\\]", multi_tables, multi_query$sql), 
    project = my_billing 
) %>% tbl_df 
Source: local data frame [449 x 4] 

    year mo da temp 
    (chr) (chr) (chr) (dbl) 
1 1930 06 11 51.8 
2 1930 05 20 46.8 
3 1930 05 21 48.5 
4 1930 07 04 56.0 
5 1930 08 08 54.5 
6 1930 06 06 52.0 
7 1930 01 14 36.8 
8 1930 01 27 32.9 
9 1930 02 08 35.6 
10 1930 02 11 38.5 
.. ... ... ... ... 

Convalida dei risultati:

table(.Last.value$year) 
1929 1930 
    92 357 
1

BigQuery SQL standard supporta l'uso di wildcard tables. Modificando l'esempio nella domanda, il seguente codice R seleziona tutte le tabelle giornaliere nel set di dati.

library(dplyr) 
library(bigrquery) 
connection <- src_bigquery("my_project", "dataset1") 
multi_days <- connection %>% 
    tbl("*") %>% 
    select(field1) %>% 
    group_by(field1) %>% 
    summarise(number = n()) %>% 
    arrange(desc(number)) 

Ecco un altro esempio che utilizza uno dei dataset di esempio BigQuery disponibili pubblicamente. In questo caso, viene selezionato solo un sottoinsieme delle tabelle, quelle tra gli anni 1994 e 2000. La query calcola la temperatura media per ogni anno consecutivo. (Nota: sarà necessario modificare il valore di billing nell'ID del proprio BigQuery per eseguire la query):

library(dplyr) 
library(bigrquery) 
bq_src <- src_bigquery(
    project = "bigquery-public-data", 
    dataset = "noaa_gsod", 
    billing = "api-project-123456789" 
) 
results <- bq_src %>% 
    tbl("gsod*") %>% 
    filter(`_TABLE_SUFFIX` %>% between("1994", "2000")) %>% 
    group_by(year) %>% 
    summarise(temp = mean(temp, na.rm = TRUE)) %>% 
    arrange(year) 
print(results)