概要
RからBigQueryに接続する方法としては大きく2種類ある。
odbc
パッケージおよびODBCドライバを使用する方法bigrquery
パッケージを使用する方法
RStudioのドキュメント(Google BigQuery)を読みながら両方試してみたので手順をメモっておく。ちなみに2の方が使い勝手が良い。
前提と説明しないこと
- 前提
- BigQueryは使える状態(課金が有効なプロジェクトが存在する)とする。
- RはRStudioから使うものとする。
- データベースの操作は
dplyr
およびdbplyr
パッケージを利用する。
- 説明しないこと
- BigQueryそのものについて。
- RおよびRStudioそのものについて。
dplyr
やdbplyr
の使い方。
方法1 odbc
パッケージを使う
結構準備が必要になる。最初に書いたようにあまり便利ではないのでおすすめはしないが、一応確認したので手順を書いておく。
必要なパッケージ
odbc
の他に接続のためDBI
も必要。
サービスアカウントの準備
ODBC経由で操作する場合はサービスアカウントを利用して接続するのが比較的手軽。
詳細は省略するが、サービスアカウントはGoogle Cloud Platformのナビゲーションメニューの「IAMと管理 > サービスアカウント」から作成し、鍵を発行してキーファイルをダウンロードしておく。
ODBCドライバのインストールとセットアップ
RStudioのProfessionalシリーズの製品を使っている場合はRStudio Professional Driversを使用することができるらしい。追加料金は不要らしいので利用可能であれば検討してみると良いかもしれない。
そうでない場合は他のドライバを用意する必要がある。公式のものがあるのでこれが選択肢になるだろう。
手元(mac)で試したところ、/etc/odbcinst.ini
に設定が記述されていた。よく確認していなかったがインストーラがやってくれるっぽい。
接続する際は次のようなコードを実行する。
con <- DBI::dbConnect(odbc::odbc(), Driver = "[your driver's name]", Catalog = "[BigQuery project name]", Email = "[Google service account email]", KeyFilePath = "[Full path to key file]", OAuthMechanism = 0)
- Driver...
odbcinst.ini
に記載されているドライバ名を記載する。(手元のodbcinst.ini
ではSimba GoogleBigQuery ODBC Driver
となっていた) - Catalog... BigQueryのプロジェクト名
- Email...サービスアカウントのメールアドレス
- KeyFilePath... キーファイルへのパス
- OAuthMechanism...
0
を指定するとサービスアカウントでの認証となる。
また、~/odbc.ini
に上記と同様の内容を書いておけばConnectionsペインから接続操作ができるようになる(cf. ODBCドライバをセットアップしてRからデータベースに接続する - Qiita)。ただ、テーブル名やフィールドは表示されない。
クエリの実行
tbl(con, "project_name.dataset_name.table_name")
のように、テーブル名はBigQueryのSQLワークスペース上でクエリを書く際と同様にプロジェクト名やデータセット名を記述する必要がある。
方法2 bigrquery
パッケージを使う
ODBCパッケージを使う方法に比べると手順が少ないのでおすすめ。
インタラクティブに使うのであればサービスアカウントの準備も不要。また、あまり試していないがAPI経由でBigQueryを操作する各種の関数も用意されている。
インストール
CRANからインストールできるのでinstall.packages("bigrquery")
でOK。
認証
インタラクティブに利用する場合はブラウザを通じて権限を承認する。bigrquery::bq_auth()
を実行するとブラウザが開くが、おそらく明示的に実行せずとも必要な場面になれば開くと思う。
非インタラクティブに操作する場合はサービスアカウントを利用する。この場合はbigrquery::bq_auth("path/to/service-account.json")
のように、サービスアカウントのキーファイルへのパスをbq_auth()
関数に渡せばよい。
コネクションの作成
DBI::dbConnect()
を使用し、次のように接続する。
con <- DBI::dbConnect( bigrquery::bigquery(), project = "project_name", dataset = "dataset_name", billing = "billing_project_name" )
project
, dataset
, billing
には次のものを指定する。
project
: 接続するデータセットを含むプロジェクトID。dataset
: データセット名。billing
: 課金が有効になっているプロジェクトID。- これは省略可能で、省略した場合は
project
と同じものが指定される。 - Googleが提供している公開データセット( BigQuery public datasets | Google Cloud)に接続する場合など、接続するデータセットのプロジェクトと課金プロジェクトが異なる場合に指定する。
- これは省略可能で、省略した場合は
クエリの実行
bigrquery
パッケージを利用する場合は、tbl(con, "table_name")
のようにテーブル名のみの指定でもクエリを実行できる。単に省略可というだけなので、プロジェクト名やデータセット名を指定しても良い。
処理されるデータサイズ表示
BigQueryのSQLワークスペース上でクエリを書くと、処理されるデータ量がクエリ実行前に表示される。
これと同等のことはbq_perform_query_dry_run()
関数で実現できる。引数としてはquery
とbilling
が最低限必要で、query
にはクエリ文字列、billing
には課金が有効なプロジェクトIDを指定する。
dplyr
とdbplyr
を使って生成したクエリを文字列にするにはsql_render()
を使えば良い。つまり、例えば次のようにすれば処理されるデータサイズが表示される。
tbl(con, "dataset_name.table_name") %>% sql_render() %>% bq_perform_query_dry_run("billing_project_name")
なお、プロジェクト名やデータセット名を省略するとsql_render()
で生成されるクエリにはこれらが含まれなくなる。したがってこの方法でデータ処理量を推定する場合はテーブル指定の記述を省略してはならず、BigQueryが解釈できるように記述しておく必要がある。
Connections paneに表示する
ODBCを使う方法でもbigrquery
パッケージを使う方法でもRStudioのConnectionsペインでテーブルの内容を確認することができない。これを可能にするパッケージとしてconnections
がある。
ただ、現在はCRANから削除されておりGitHubからインストールする必要がある。
使用方法はDBI::dbConnect()
をconnections::connection_open()
に置き換えるだけ。
その他
explain()
は使えない。grepl()
の翻訳結果で第一引数がフィールド、第二引数がパターンとなりgrepl(x, pattern)
のように記述する必要があった。- データ処理量が小さいクエリを発行しても
Billed: 10.49 MB
と表示される。- どうもデータクエリの最小値らしい?
- (2022/02/06追記) 処理されたバイト数と課金されるバイト数は異なり、課金されるバイト数の最小値は10MBのためこのような表示になっている模様。10.49MB≒10MiB。