データサイエンス

Jupyter notebookからGCPのBigQueryにアクセスしてPandasのDataFrameに読み込む方法

構造化された大量のデータをいつでも分析に使える形で持っておきたい!というケースでよく使うのが、Google Cloud Platform(GCP)のBigQuery(以下BQ)です。
標準SQL文と互換性があるので、普段からRDBを扱っている人にも無理なく使えると思います。*1

一方で、普段からPythonで開発しているばあい、Jupyter notebookから直接BQのデータを取得してからPandas等で加工するケースも多くあるかと思います。

JupyterからGCPリソースにアクセスするとなると認証などが厄介なのですが、

  • 認証ライブラリpydata-google-auth

を利用することで簡単にデータを取得できるようになるほか、

  • PythonGCPクライアント google-cloud-bigquery
  • Pandasの拡張ライブラリ Pandas-gbq

のいずれかを使うことで、PandasのDataFrameにも直接読み込むことができます。


pydata-google-authによる認証キーの発行

概要

まず、BigQueryに限らずクラウド上のアクセスするためには、通常認証キーが必要になります。
このキーをファイル形式で発行する方法もありますが、
外部への流出を気を付けなくてはいけませんし、
notebook上で開発するだけなら少々手間ですしリスクもあります。

そこで登場するのが、pydata-google-authというライブラリです。
これを使うと、ブラウザ上で簡単に認証を行うことができ、
さらにキーもnotebook上の変数として持つことができます。

方法

以下のようにnotebookのセルに打ち込んで実行してみてください。

import pydata_google_auth
credentials = pydata_google_auth.get_user_credentials(
['https://www.googleapis.com/auth/bigquery'],
)

すると、新たなブラウザが立ち上がり、自分のGoogleアカウント選択を求められます。
画面の指示に従っていけば認証キーが発行され、
変数credentialsの中に格納されます。

これを以下のGCPクライアントに渡すことで、選択したアカウントで許可されたリソースにアクセスできるようになります。


データ取得方法① GCPクライアントを使用する

概要

BQに限らず、GCPのリソースに対してはPythonから操作するためのSDK(Software Development Kit)が存在します。

サービスごとにライブラリが分かれていますが、BQの場合google-cloud-bigqueryを使います。

基本的には文字列でqueryを書いて、APIに引き渡す形になります。

方法

例えば、特定のテーブルから10行だけ取り出すqueryをBQに投げます。

from google.cloud import bigquery
client = bigquery.Client(project='<project_id>', credentials=credentials)
query = 'SELECT * FROM <data set名>.<table名> LIMIT 10'
df_result = client.query(query).to_dataframe()

これだけです。
query実行後に.to_dataframe()メソッドを用いることで、PandasのDataFrameとして出力するところまでできてしまいます。

最初の行でアクセスしたいリソースを所持するGCP Projectを指定していますが、
この際に先ほど取得した認証キーcredentialsを入れているのが分かります。


データ取得方法② Pandasの拡張ライブラリを使用する

概要

GCPクライアントは、BQのみならずGCSなど他のGCPリソース向けのものも用意されています。
そういう意味で上記の方法は標準的なものと言えますが、
BQについてはPandasの拡張ライブラリを使って直接DataFrameに読み込む方法もあります。

方法

まず前提として、Pandas-gbqをインストールしておきます。

pip install pandas-gbq

そのうえで通常通りPandasをimportすると、read_gbq()メソッドが使えるようになります。
引数にはファイル名を指定する代わりに、

  • query文字列
  • project_id
  • credentialオブジェクト

などを入れます。

import pandas as pd
project_id = '<project_id>'
query = 'SELECT * FROM <data set名>.<table名> LIMIT 10'
df = pd.read_gbq(query, project_id, dialect='standard', credentials=credentials)

ここでも、先ほどpydata-google-authから取得したcredentialsオブジェクトを使います。

まとめ

pydata-google-authを使えば自身の持つGoogleアカウント情報と紐づいた認証キーをオブジェクトとして簡単に取得でき、
それをGCPクライアントやPandas拡張ライブラリに食わせるだけで簡単にBQのデータをDataFrameとして持つことができます。

今回はデータの取得だけしか解説しませんでしたが、データの挿入、テーブルの作成・削除などあらゆる操作を(権限がある限り)Pythonから行うことができます。

詳しくは下記の公式ドキュメントを参照してください。

参考

*1:ただし、予期せぬ大量アクセスによるBigQuery破産にはご注意!