ヘヴィメタル・エンジニアリング

AWS特化型エンジニアのほのぼのヘヴィメタルブログ

ヘヴィメタル・エンジニアリング

クラウド特化型ヘヴィメタルエンジニアのほのぼのブログ

BigQueryテーブル、データセットの作成を効率化 ~ Makefile編 ~

はじめに

よくGCPに触れるものです。

データウェアハウスとして頻繁に用いられる BigQuery ですが、いちいちデータセットやテーブルを作成するのは面倒なので、コマンドベースでお手軽に作成できるようにしましょう。

今回は Makefile を用います。

準備

まず以下のコマンドをローカルで使えるように準備してください。

gcloud
bq
make

bq のオペーレーションが行われるGCPプロジェクトはgcloudコマンドの向き先に依存するので、gcloudコマンドで configuration を設定しましょう。

$ gcloud config set project <project name>

これでbqコマンドを用いたとき之処理が、gcloudコマンドで設定した向き先で行われます。

Makefileの作成

まず以下のようなディレクトリ構成を作ります。

working dir
├── Makefile
├── .env

Makefile内の環境変数渡しにはdotenvを用います。

次にMakefile内にBigQueryデータセットとテーブルを作成する処理を追加します。

Makefile

include .env

.PHONY: create-bigquery-dataset create-bigquery-table

create-bigquery-dataset:
    @read -p "Specify the dataset name  : " dataset; \
    bq mk --dataset \
        --location=$(BIGQUERY_DATASET_LOCATION) \
        $$dataset

create-bigquery-table:
    @read -p "Specify the dataset name : " dataset; \
    read -p "Specify the table name: " table; \
    bq mk --table \
        --time_partitioning_type=DAY \
        --time_partitioning_field=createdTime \
        --schema=id:STRING,name:STRING,createdTime:TIMESTAMP \
                 $$dataset.$$table

テーブルのschemaは至って単純なもので、例としてTIMESTAMP型の column を用意して、パーティションを切ってみました。

時系列データはパーティションを切ることで、BigQueryのクエリパフォーマンスが向上します。

Makefile内でのポイントとしては

・includeで.envを読み込む
・コマンドの頭に@をつけることで、コマンドラインにコマンドを表示しない
・readコマンドで読んだ変数はMakefile内で$$を付けて使用

です。

そして、データセット作成の際に指定している環境変数は.envに書き込みます。

.env

BIGQUERY_DATASET_LOCATION=us

動作確認

Makefile を置いているディレクトリでmakeコマンドを実行しましょう。

$ make create-bigquery-dataset
create bigquery dataset...
Specify the dataset name  : foo_dataset
Dataset 'xxx:foo_dataset' successfully created.


$ make create-bigquery-table
create bigquery table...
Specify the dataset name  : foo_dataset
Specify the table name  : bar_table
Table 'xxx:foo_dataset.bar_table' successfully created.

実際に作成されたかGCPコンソールからも確認しましょう。 f:id:xkenshirou:20211014201741p:plain

TIPS

パーティションをカラムに設定した場合は、パーティションの有効期限も指定することをおすすめします。

データウェアハウスに貯めるデータとして、一定期間過去のデータは不要な場合は、ライフサイクルを設定することが大切です。
これにより余分なコストを抑えることができます。

ついでに Makefileパーティションの有効期限を設定するコマンドも用意しましょう。

Makefile

.PHONY: set-bigquery-table-expiration-date

set-bigquery-table-expiration-date:
    @read -p "Specify the dataset name : " dataset; \
    read -p "Specify the table name : " table; \
    bq update --time_partitioning_expiration $(BIGQUERY_TABLE_PARTITIONING_EXPIRATION_TIME) $(GCP_PROJECT_NAME):$$dataset.$$table

.envにGCP_PROJECT_NAMEも設定します。

今回は有効期限を30日にします。

.env

BIGQUERY_TABLE_PARTITIONING_EXPIRATION_TIME=2592000

コマンドを実行します。

$ make set-bigquery-table-expiration-date
Specify the dataset name  : foo_dataset
Specify the table name  : bar_table
Table 'xxx:foo_dataset.bar_table' successfully updated.

GCPコンソールで確認します。

f:id:xkenshirou:20211014202413p:plain

設定できました。

まとめ

このようにコマンド化することで、環境構築が簡単になります。

あくまで今回はBigQueryの環境構築をしましたが、様々な環境構築をMakefileで効率化することで開発スピードは上がります。

できるところはどんどん作業効率化していきましょう。