RからBigQueryに接続してデータを取得してみる

こんにちは、小澤です。

私はR大好きです。データ分析をするときは積極的にRを活用していきたいものですね。 というわけで、RからBigQueryに接続してデータ取得する方法を見ていきます。

BigQueryへの接続とbigrquery

RからBigQueryに接続するにはbigrqueryというライブラリが利用できます。

install.packages("bigrquery")

これを使うと簡単にSQLを発行してデータの取得ができます。

library(bigrquery)

# サービスアカウントのkeyを使って認証
# email引数で認証も可能
bq_auth(path = "path/to/service-account.json")

# 実行するSQLを記述
# ここでは公開データセットのものを利用している
sql <- "select
    totals.newVisits, 
    totals.pageviews, 
    device.browser, 
    device.operatingSystem, 
    device.isMobile, 
    geoNetwork.continent
from 
    `bigquery-public-data.google_analytics_sample.ga_sessions_*`
where
    _TABLE_SUFFIX between '20160801' and '20170531'
"

# クエリを実行し、結果を取得
result <-  bq_project_query("", sql) %>% 
  bq_table_download()

head(result)

以下のような結果が取得されます。

# A tibble: 6 × 6
  newVisits pageviews browser           operatingSystem isMobile continent

1         1         1 Internet Explorer Windows Phone   TRUE     Europe   
2         1         1 BlackBerry        BlackBerry      TRUE     Europe   
3         1         1 Internet Explorer Windows Phone   TRUE     Europe   
4         1         2 Internet Explorer Windows Phone   TRUE     Americas 
5        NA         3 Internet Explorer Windows Phone   TRUE     Americas 
6        NA         1 Safari            Windows Phone   TRUE     Asia

必要なSQLさえ記述すれば、非常に簡単にデータを取得できることがわかるかと思います。

また、bq_auth にて認証を行っていない場合は後続の処理で実行時に対話的に認証を行うことも可能です。

DBIのコネクションを作成する

bigrqueryでは、DBIのコネクションを作成することで、DBIやdbplryでの操作も可能です。

library(bigrquery)
library(DBI)

con <- dbConnect(
  bigquery(),
  project = "<your_project_id>",
  dataset = "<dataset_name>",
  billing = "<billing_project>"
)

dataset および billing 引数は任意の引数となります。

これは、BigQueryの構造が project.dataset.table のような階層となっていることによるものです。

そのため、以下のような考え方になります。

  • SQL文中でこれらを指定する場合にはそのタイミングで明示される
  • dbplyrのtbl関数を利用する場合などは上位の階層を補完する
  • 課金対象となるプロジェクトとデータを取得するプロジェクトが異なる場合billingで明示する

コネクションが取得できればあとは、他のデータベースへのコネクション取得時と同様の使い方ができます。

注意点

お使いの環境によっては、データがうまく取得できない場合があります。

おわりに

今回はRからBigQueryに接続するbigrqueryを紹介しました。 R大好きな方々のお役に立てれば幸いです。