【Python】GCPのBigqueryを「google-cloud-bigquery」を使って操作する

この記事は約6分で読めます。

 

こんにちは、ミナピピン(@python_mllover)です。今回はPythonからGCPのBigqueryにアクセスしてテーブルの作成からデータの挿入、呼び出すまでを一通り紹介していきたいと思います。

 

PythonからGCPにアクセスする

 

プログラムからGCPのAPIを使用するためにはまず認証が必要になります。

以下のページにアクセスしてください。

Getting started with authentication  |  Authentication  |  Google Cloud

 

ページ内の手順に従ってサービスアカウントのキーをjson形式で作成して、自分のPCの適当な場所にダウンロードしてください。

 

次に必要なライブラリをインストールします。

# ライブラリをインストール
$ pip install google-cloud-bigquery

 

これで前準備は完了です、ここからGCPにアクセスしていきます。まずBigqueryにテーブルを新規作成してみましょう。

 

PythonからBigqueryのテーブル作成

 

from google.cloud import bigquery
import os
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path/to/~.json' # JSONのパスは任意

client = bigquery.Client()
client = bigquery.Client(project=projectid) # プロジェクトIDはプロジェクトの選択で表示されるID

# テーブルの列名とデータ種類を指定
schema = [
    bigquery.SchemaField("date", "TIMESTAMP", mode="REQUIRED"),
    bigquery.SchemaField("ticker", "STRING", mode="REQUIRED"),
    bigquery.SchemaField("open", "NUMERIC", mode="REQUIRED"),
    bigquery.SchemaField("high", "NUMERIC", mode="REQUIRED"),
    bigquery.SchemaField("low", "NUMERIC", mode="REQUIRED"),
    bigquery.SchemaField("close", "NUMERIC", mode="REQUIRED")
]

# table_id = "your-project.your_dataset.your_table_name"
table = bigquery.Table(table_id,schema=schema)
table = client.create_table(table)

# できたか確認
print(
    "Created table {}.{}.{}".format(table.project, table.dataset_id, table.table_id)

 

 

PythonからテーブルにデータをINSERT

 

#Set Project ID
project = projectid
# Set Dataset
dataset = dataset_name
## Set Table
table = table_name
 
bigquery_client = bigquery.Client()
query = "INSERT INTO `{0}.{1}.{2}` (date, symbol, open, high, low, close) SELECT TIMESTAMP('2019-03-01'), 'BTC', 2751440, 2811990, 2752700, 2700200 ".format(project, dataset, table)
 
rows = bigquery_client.query(query).result()

 

 

実装してて少しハマったのはdatetimeとかtimestampのデータを挿入する場合で、クエリの文字列の中でTIMESTAMP()とかDATE()とかDATETIME()みたいに関数で括っておかないと、以下のようなエラーが表示されます。

 

 

400 Query column 1 has type STRING which cannot be inserted into column date, which has type TIMESTAMP

 

また以下のエラーが表示される場合は支払い情報を登録していないこと原因なので、アカウントとクレカ情報を紐づけてアカウントをアップデートください。

 

403 Billing has not been enabled for this project. Enable billing at https://console.cloud.google.com/billing. DML queries are not allowed in the free tier. Set up a billing account to remove this restriction.

 

Pythonからテーブルのデータを呼び出す

 

from google.cloud.bigquery.table import RowIterator, Row
from google.cloud.bigquery.job import QueryJob
import itertools

# クエリ定義
query = "SELECT date,symbol,open,high,low,close FROM `{0}.{1}.{2}`".format(project, dataset, table)

# JOB実行
query_job: QueryJob = client.query(query)
rows: RowIterator = query_job.result() # APIリクエスト発生+結果待ち合わせ
# 取得したデータを確認
for row in rows:
    print(row)
    print('------------------')

 

終わり

 

以上がPythonからBigqueryへの基本操作です。最近はレンタルサーバーよりGCPみたいなクラウドでデータを管理した方が安上がりみたいなので、そっちに移行するため色々と試行錯誤している最中です笑

 

:2021/01/02追記

Bigqueryの操作はpandas-gbqの方がやりやすいです。

 

 

 

 

コメント

タイトルとURLをコピーしました