BigQueryをDWHとして活用する場合、
アプリケーションやバッチプログラムからBigQueryにアクセスしてデータを取り出したり、更新を行えたら便利ですよね。
本記事では特に分析用途として用いられることが多いプログラミング言語PythonからBigQueryを操作する方法をご紹介します。
BigQuery APIの有効化
まずはGoogle Cloudプロジェクト上でBigQuery APIを使えるように有効化します。
Google Cloudプロジェクト > APIとサービス > ライブラリ
より、BigQueryと検索すると、BigQuery APIが表示されるので、「有効にする」をクリックして有効化しましょう。
認証用のサービスアカウントの作成
BigQuery認証用のサービスアカウントを作成します。ユーザーアカウントでの認証も可能ですが、定期的にブラウザでの再認証が必要となり、バッチプログラムなどクラウド上での実行に向いていないため、今回は最もメジャーな認証方法であるサービスアカウントでの認証の手順をご説明します。
サービスアカウントは、IAMと管理 > サービスアカウント > サービスアカウントの作成
より作成できます。
付与するIAMのロールとして、例えば「BigQueryジョブユーザー」、「BigQueryデータオーナー」を付与して、サービスアカウントにBigQueryを操作する権限を与えておきましょう。
サービスアカウントの詳細ページの、キー > 鍵を追加 よりJSON形式の鍵ファイルを作成。鍵ファイルは任意の場所に保存し、外部の人間がアクセスできないように注意しましょう。
google-cloud-bigqueryのインストール
次にPython上でBigQueryを操作するためのライブラリgoogle-cloud-bigqueryをインストールします。
PythonはPython3、AnacondaなどのPython3環境を準備しておきましょう。
$ pip install google-cloud-bigquery
PythonでBigQueryを操作する
認証用アカウントとBigQueryを操作するライブラリが準備できたので、実際にPythonでBigQueryを操作するプログラムをご紹介します。
BigQueryクライアントの作成
Python上でBigQueryを操作するクライアントを作成するには、GOOGLE_APPLICATION_CREDENTIALSという環境変数に先ほど作成したサービスアカウントの鍵ファイルを指定します。
サービスアカウントの鍵ファイルはプログラムと同階層のフォルダ内に格納します。
import os
os.environ[‘GOOGLE_APPLICATION_CREDENTIALS’] = “xxx.json”
次に以下のコードでクライアントを作成します。(xxxにはBigQuery APIを有効化したプロジェクト名が入ります。)
from google.cloud import BigQuery
client = bigquery.Client(project=”xxx”)
これで指定したサービスアカウントによるBigQueryクライアントが作成できました。
BigQueryに新しいテーブルを作成
BigQueryに新しいテーブルを作成するには以下のコードを書きます。
clientは前述したBigQueryクライアントです。
from google.cloud import bigquery
# テーブルスキーマを定義する
schema = [
bigquery.SchemaField(“id”, “STRING”, mode=”REQUIRED”),
bigquery.SchemaField(“name”, “STRING”, mode=”REQUIRED”),
bigquery.SchemaField(“age”, “INTEGER”, mode=”REQUIRED”),
]
# 新しいテーブルを作成する
table_id = “my_dataset.my_table”
table = bigquery.Table(table_id, schema=schema)
table = client.create_table(table) # テーブルが既に存在する場合は例外が発生する
print(f”Created table {table_id}”)
BigQueryにクエリを実行してデータを読み込む
BigQueryにクエリを実行するには以下のようなコードを書きます。
SELECT文でデータを読み取る以外にもUPDATEやDELETEなど更新処理も可能です。
from google.cloud import bigquery
# クエリを定義する
query = “””
SELECT *
FROM my_dataset.my_table
WHERE age >= 18
“””
# クエリを実行する
query_job = client.query(query)
# クエリ結果を処理する
for row in query_job:
print(row)
BigQueryにデータを書き込む
BigQueryにデータを書き込むには以下のようなコードを書きます。
from google.cloud import bigquery
# データを定義する
rows_to_insert = [
(“1”, “Alice”, 25),
(“2”, “Bob”, 30),
(“3”, “Charlie”, 35),
]
# データを書き込む
table_id = “my_dataset.my_table”
table = client.get_table(table_id)
errors = client.insert_rows(table, rows_to_insert) # 書き込みに失敗した場合はエラーが返される
if errors == []:
print(“Rows inserted successfully.”)
else:
print(“Error inserting rows:”, errors)
BigQueryのテーブルからデータを読み込んでPandasのDataFrameに変換する
続けて応用例ですが、BigQueryのデータをPandasのDataFrameで解析用に加工したい場合は、以下のコードでBigQueryのデータを取得してDataFrame形式に格納できます。プログラム上でスムーズに加工処理が行えるようになるため、非常に便利です。
from google.cloud import bigquery
import pandas as pd
# クエリを定義する
query = “””
SELECT *
FROM my_dataset.my_table
“””
# クエリを実行してデータを取得する
query_job = client.query(query)
results = query_job.result()
# 結果をPandasのDataFrameに変換する
df = pd.DataFrame(
[(row[“id”], row[“name”], row[“age”]) for row in results],
columns=[“id”, “name”, “age”],
)
print(df.head())
BigQueryのテーブルからデータを読み込んでCSVファイルとして出力する
BigQueryのテーブルからデータを読み込んでCSVファイルとして出力するには以下のようなコードを書きます。
BigQueryのコンソール画面からCSVファイルをエクスポートするのと同じ要領でプログラム上でも実現できます。
from google.cloud import bigquery
import csv
# クエリを定義する
query = “””
SELECT *
FROM my_dataset.my_table
“””
# クエリを実行してデータを取得する
query_job = client.query(query)
results = query_job.result()
# 結果をCSVファイルに書き込む
with open(“output.csv”, “w”, newline=””) as csvfile:
writer = csv.writer(csvfile)
writer.writerow([“id”, “name”, “age”])
for row in results:
writer.writerow([row[“id”], row[“name”], row[“age”]])
print(“Data written to output.csv.”)
まとめ
PythonでBigQueryへのアクセス、データ操作を行う方法についてお話しましたがいかがでしたでしょうか。
ご紹介したようにPythonからのデータの操作はもちろん、Pandasを利用してデータの加工や統合処理まで行えるため、サーバレスコンピューティングのCloud Functionsなどのサービスをインフラとして使えば、ETL処理をGoogle Cloudのサービス上で自動化することも可能と、かなり汎用的にBigQueryを活用していただけます。
株式会社KUIXではただ導入・開発するだけでなく、導入後の利活用を実現することに着眼した、BIツールの選定・導入からレポート作成、運用、啓蒙・展開までトータルのコンサルテーションなどを行っています。
「BigQuery/BIツールを導入したい」
「すでに導入しているがデータ活用、展開が進んでいない」など
お困りの方は、ぜひお気軽にご連絡ください!お問い合わせはこちらから
BigQueryのSQLチートシートをダウンロード