2016-04-28 5 views
5

Ich versuche, mehrere Tabellen aus einem Dataset in Big Query mit dplyr und bigrquery abzufragen. Der Datensatz enthält mehrere Tabellen, eine für jeden Tag von Daten in einem Jahr. Ich kann von einer einzelnen Tabelle (z. B. 1 Tag Daten) mit dem folgenden Code abfragen, aber es scheint nicht zu ermöglichen, dass es über mehrere Tabellen gleichzeitig funktioniert (z. B. für einen Monat oder ein Jahr von Daten). Jede Hilfe würde sehr geschätzt werden.Wie wählt man aus mehreren Tabellen innerhalb eines Datasets in Big Query mit dplyr und bigrquery aus?

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

Danke,

Juan

Antwort

0

Was 'list_tabledata' im 'bigrquery' verwenden?
Ich habe dieses Stück Code mit der gleichen Notation wie Sie getestet und die Ausgabe ist so viele .RData-Dateien in Ihrem Arbeitsverzeichnis als Tage in Ihrem Datumsbereich.

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"))  
    }  

Ich hoffe, es funktioniert!
Lourdes Hernández

1

Soweit ich weiß, gibt es keine Unterstützung für table wildcard functions in dplyr ist und bigrquery im Moment. Wenn Sie keine hässlichen Hacks befürchten, können Sie jedoch die Abfrage, die dplyr erstellt und an bq sendet, extrahieren und bearbeiten, sodass sie auf mehrere Tabellen anstatt nur auf einen zeigt.

Stellen Sie Ihre Zahlungsinformationen und eine Verbindung zu BigQuery:

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

Wie aus einer Tabelle auswählen (nur zum Vergleich):

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 
.. ... ... ... ... 

Wie durch manuell aus mehreren Tabellen auswählen Bearbeiten der von dplyr generierten Abfrage:

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 
.. ... ... ... ... 

Validierung der Ergebnisse:

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

BigQuery Standard-SQL unterstützt die Verwendung von wildcard tables. Durch Ändern des Beispiels in der Frage wählt der folgende R-Code alle Tagestabellen im Dataset aus.

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

Hier ist ein weiteres Beispiel, das einen der öffentlich verfügbaren BigQuery-Beispieldatensätze verwendet. In diesem Fall wird nur eine Teilmenge der Tabellen ausgewählt - die zwischen den Jahren 1994 und 2000. Die Abfrage berechnet die Durchschnittstemperatur für jedes aufeinander folgende Jahr. (Hinweis: Sie müssen den Wert billing in Ihre eigene BigQuery-Projekt-ID ändern, damit die Abfrage ausgeführt werden kann):

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) 
Verwandte Themen