はじめに
よく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データセットとテーブルを作成する処理を追加します。
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コンソールからも確認しましょう。
TIPS
パーティションをカラムに設定した場合は、パーティションの有効期限も指定することをおすすめします。
データウェアハウスに貯めるデータとして、一定期間過去のデータは不要な場合は、ライフサイクルを設定することが大切です。
これにより余分なコストを抑えることができます。
ついでに 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コンソールで確認します。
設定できました。
まとめ
このようにコマンド化することで、環境構築が簡単になります。
あくまで今回はBigQueryの環境構築をしましたが、様々な環境構築をMakefileで効率化することで開発スピードは上がります。
できるところはどんどん作業効率化していきましょう。