構造化された大量のデータをいつでも分析に使える形で持っておきたい!というケースでよく使うのが、Google Cloud Platform(GCP)のBigQuery(以下BQ)です。
標準SQL文と互換性があるので、普段からRDBを扱っている人にも無理なく使えると思います。*1
一方で、普段からPythonで開発しているばあい、Jupyter notebookから直接BQのデータを取得してからPandas等で加工するケースも多くあるかと思います。
JupyterからGCPリソースにアクセスするとなると認証などが厄介なのですが、
- 認証ライブラリpydata-google-auth
を利用することで簡単にデータを取得できるようになるほか、
のいずれかを使うことで、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破産にはご注意!