BigQuery ist ein leicht skalierbares Data Warehouse in der Google Cloud. Mit Standard SQL Abfragen kann auf Daten zugegriffen werden und mittels R-Paket bigrquery kann ich Daten aus BigQuery auch leicht in R verwenden. BigQuery, der Hidden Champion von Google 🙂

Es gibt im Netz bereits viele Artikel dazu, wie ich Daten aus Google BigQuery in R nutzen kann, z.B. San Francisco Crime Heatmaps in R Using BigQuery bigrquery and ggmap. Die Blogbeiträge im Netz zeigen oft beispielhaft den Datenzugriff anhand öffentlicher Datensätze. Diese öffentlichen Beispiel-Daten liegen in BigQuery innerhalb der Region US. Wechselt man zu eigenen Datensätzen, die z.B. in Europa liegen, stimmt die Region nicht mehr überein und es kommt zu Fehlern.

library(bigrquery)
project <- "xxx project id xxx"
sql     <- "SELECT * FROM myproject.dataset.table LIMIT 10"
bq_dt   <- bq_project_query(project, sql)
dt      <- bq_table_download(bq_dt)

## Error: Not found: Job myproject:job_Xl2ywM01rX6vBCB4 [notFound]

Durch die Übergabe des SQL Statements wird ein BigQuery Job erzeugt, der in seinem Identifier auch einen Bezug zur Region hat. Ist diese Region nicht gegeben, wird sie standardmäßig auf US gesetzt. Daher funktionieren die Beispiel prima für US Datensätze, nicht aber für z.B. europäische Datensätze. Leider gibt es im Moment in bigrquery keine Möglichkeit in der Query einen Location-Parameter mitzugeben.

Einen Workaround liefert zacdav in https://github.com/r-dbi/bigrquery/issues/274 Es muss manuell der Location-Parameter in der Funktion bq_get() gesetzt werden. Mit fix() wird ein Editor für die Funktion aufgerufen und hinterher die bearbeitete Version in meinem aktuellen Workspace dem Funktionsnnamen wieder zugewiesen. Wird das R-Paket bigrquery neu geladen, muss auch die Funktion wieder neu überschrieben werden. Hier im Code Snippet ist jetzt die Region europe-west2 gesetzt.

trace(bigrquery:::bq_get, edit=TRUE)

bq_get
function (url, ..., query = NULL, raw = FALSE, token = get_access_cred()) 
{

  #~~~ alt ~~~#
  #    req <- GET(paste0(base_url, url), config(token = token), 
  #        httr::user_agent(bq_ua()), ..., 
  #         query = prepare_bq_query(query))

  #~~~ neu ~~~#
       req <- httr::GET(paste0(base_url, url), httr::config(token = bigrquery:::get_access_cred()), 
                   httr::user_agent(bigrquery:::bq_ua()), 
                   query = "location=europe-west2")

  process_request(req, raw = raw)
}