PythonでBigqueryを操作

PythonでBigqueryを操作

Bigqueryのテーブル作成→サービスアカウント作成→PythonでBigquery操作

BigqueryはGoogle Cloud Platform(GCP)の提供するデータベース。
Pythonでquery操作してデータ取得できると便利なので実験。

1. テスト用のテーブル作成

Bigqueryに実験用のデータセット・テーブルを作成。
GCPのアカウント・プロジェクトは作成済。

1.1. データセット作成

Bigqueryにアクセス。

https://console.cloud.google.com/bigquery



「データセットを作成」



適当な名前、ここでは「dataset」と付ける。
データのロケーションも適当に、ここでは「us-west1」。
「データセットを作成」するとdatasetという名前のデータセットが作成される。

1.2. テーブル作成

データセットの中にテーブルを作成。
事前に適当なcsvファイルを用意しておく。



さっき作ったデータセット(dataset)を選択して「テーブルを作成」。



「テーブルの作成元」→「アップロード」として、
適当なcsvファイルをアップロード。

別に他の方法で作ってもいい。



テーブルに適当な名前、ここでは「table_01」と付ける。
スキーマの自動検出にチェックを付けて「テーブルを作成」。

2. サービスアカウント準備

GCPに外部からアクセスするためにサービスアカウントが必要となる。

2.1. ロール作成

サービスアカウントに付与するためのロールを作成する。



「IAMと管理」→「ロール」→「ロールを作成」。



適当な名前「sample-role」を付けて「権限を追加」。



権限が星の数ほどあり選ぶのが大変なのでフィルタに検索ワードを入れる。
目的の権限にチェックを付けて追加する。
今回必要な権限は以下の2つ。



「bigquery.jobs.create」、「bigquery.tables.getData」を選択して「追加」。

ここで作成したロールを次にサービスアカウントへ付与する。

2.2. サービスアカウント作成

GCPにアクセス。



「IAMと管理」→「サービスアカウント」。



「サービスアカウントを作成」



「サービスアカウントID」に適当な名前「sample」を付けて「作成して実行」。



「ロールを選択」して「続行」。



選択するのはさっき作った「sample-role」。



特に何もせず[「完了」。

サービスアカウントが作られた。

2.3. サービスアカウントのキー作成

サービスアカウントを使用するためのキーを作成する。



さっき作ったサービスアカウントを選択。
「キー」→「鍵の追加」→「新しい鍵を作成」。



「JSON」を選択して「作成」。

作成されたキーであるjsonファイルがダウンロードされる。
このキーを後で使う。

3. Python

2.3.で作成したjsonファイル(サービスアカウントキー)を準備しておく。
コード内から参照する。

3.1. 環境設定

Anacondaが既にインストールされている前提。
入ってなければ以下を参考にして入れる。
別にAnacondaである必要はない。

以下のように「gcp」という名前の環境を作り、必要なライブラリをインストール。

1
2
3
4
5
conda create -n gcp
activate gcp
conda install -c conda-forge google-cloud-storage
conda install pandas
conda install -c conda-forge pandas-gbq=0.16

pipでもなんでもいい。
pandas-gbq=0.16としているのは最新の0.17が何故かpython=3.1を求めているから。

3.2. Bigqueryからデータ取得

Bigqueryからデータ取得。
以下の情報が必要。

  • サービスアカウントキー
  • プロジェクトid
  • データセット名
  • テーブル名
1
2
3
4
5
6
7
8
9
from google.oauth2.service_account import Credentials
import pandas as pd

credentials = Credentials.from_service_account_file(filename="サービスアカウントキー.json")
query = "select * from `データセット名.テーブル名(ここではdataset.table_01)`;"
project_id = "プロジェクトid(プロジェクト名の後にハイフンと数字の付いたやつ)"

df = pd.read_gbq(query=query, project_id=project_id, credentials=credentials)
print(df)

4. エラー

〇〇に対応する権限がサービスアカウントに付与されたロールに与えられていないと以下のエラーが発生する。

1
403 POST ~~ ××.iam.gserviceaccount.com does not have 〇〇 access to the Google Cloud project.

サービスアカウントに付与されたロールに「bigquery.tables.getData」がない場合は以下の表示。
少し回りくどいメッセージ。

1
2
Exception has occurred: GenericGBQException
Reason: 403 Access Denied: Table 〇〇: User does not have permission to query table 〇〇, or perhaps it does not exist in location 〇〇.

5. 参考

サービスアカウント
https://cloud.google.com/iam/docs/grant-role-console?hl=ja

pandas-gbq(ライブラリ)
https://pandas-gbq.readthedocs.io/en/latest/howto/authentication.html

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×