PythonでBQからデータを抽出

2023年1月4日

ゴール

サーバーを立ち上げて、curl http://localhost:8080を実行すると「BQからデータを抽出」ができる
グレーになっている部分はターミナルで実行

目次
  1. 使用するライブラリ
  2. 手順
    1.
    サービスアカウントの作成
    2. 1つのファイルを作成 (bigquery.py)
    3. 既存のファイルを編集
    4. ライブラリをインストール
    5. 確認

    認証のエラーが出た時
  3. 参考にした資料

前提

「Hello World」が表示できる環境からスタート

※今回は下記の記事でBQにデータが格納されている状態を想定してます。

使用するライブラリ

  • google-cloud-bigquery

手順

① サービスアカウントの作成 ※既に作成されている場合は②へ
「GCP > APIとサービス > 認証情報」( https://console.cloud.google.com/apis/credentials )に移動して作成
1. サービスアカウント名を入力
2. 作成して続行をクリック
3. ロールを選択(今回は編集者にしました)
4. 続行をクリック
5. 完了
keyの作成
1. 上記手順で作成したアカウントがあることを確認
2. そのアカウントのリンクをクリック
3. 「キー」を選択
4. 鍵を追加、「新しい鍵を作成」をクリック
5. 「JSON」で作成
JSON
・ 上記でダウンロードした「JSON」をapp.pyと同じ階層でcredentials.jsonとして保存

② 1つのファイルを作成する
– bigquery.py

from google.cloud import bigquery

DATASET = 'BQデータセット'
BQ_TABLE = 'BQテーブル'

def select(datetime_bq_partition):
    bq_client = bigquery.Client()
    table_id = bq_client.dataset(DATASET).table(f'{BQ_TABLE}_{datetime_bq_partition}')
    return bq_client.query(f'select * from `{table_id}`')

③ 既存のファイルを編集

import os
from flask import Flask
import bigquery
from datetime import datetime, timedelta, timezone

app = Flask(__name__)

@app.route("/")
def test():
    data = []

    JST = timezone(timedelta(hours=+9), 'JST')
    now = datetime.now(JST)
    datetime_bq_partition = now.strftime('%Y%m%d') # BQテーブルのパーティション取得用日時

    rows = bigquery.select(datetime_bq_partition)
    for row in rows:
        data.append(row)
    print(data)

    return "Hello World!"

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

④ ライブラリをインストールする
pip install -r requirements.txt

⑤ 確認
– ターミナルでpython3 app.py を実行すると、Running on http://....8080と表示される
– 別ターミナルでcurl http://localhost:8080を実行し「Hello World!」が表示

– ターミナルで格納されていたデータが抽出できていればOK!

認証のエラーが出た時

credential.jsonの「パスをコピー」して、下記をターミナルで実行する

export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

参考にした資料

bigquery

Posted by shun