Dataformでコンパイル変数を使ってみた

WorkflowsからDataformの起動方法を検証してみました。Dataformタグ指定、コンパイル変数のWorkflowsからの上書きができるか、もあわせて検証してみました。
2024.05.02

データアナリティクス事業本部の根本です。Dataformを使っていて、呼び出しもと(Workflowsとか)から動的に値を変えてDataformを呼び出すことができたらいいなと思い調べてみたらコンパイル変数を用いたらできたので記事にしてみました。

この記事の対象者

  • Dataformでコンパイル変数を使ってみたいひと

前提条件

  • Dataformのワークスペースやリポジトリが存在する、使えること

検証の全体像

  • コンパイル変数をdataform.jsonで指定して動作するか確認
  • APIでDataformを実行するときにコンパイル変数の値を上書きして動作するか確認

上記2つの検証をしていきます。

やってみる

それでは早速やっていきます。

コンパイル変数をdataform.jsonに定義する

今回定義したdataform.jsonは以下です。

dataform.json

{
  "defaultSchema": "BQのデータセット名",
  "assertionSchema": "dataform_assertions",
  "warehouse": "bigquery",
  "defaultDatabase": "project-id",
  "defaultLocation": "region",
  "vars": {"sample_val":"123"}
}

"vars": {"sample_val":"123"}←これがコンパイル変数の定義部分になります。リファレンスを元に実装しました。
今回定義したコンパイル変数は、デフォルト値が123となります。  

コンパイル変数が動作するかテストしてみる

まずは設定したコンパイル変数が動作するかを確認するため、SQLXファイルで使用してみます。コンパイル変数はdefinitions配下のSQLXファイルで使用することができます。
以下が定義したSQLXファイルです。

compile_val_test.sqlx

  config { type: "view" }
  SELECT ${dataform.projectConfig.vars.sample_val} AS compile_val_test_view

${dataform.projectConfig.vars.変数名}で、dataform.jsonで定義したコンパイル変数を取得することができます。
それではコミットして、Dataformワークフローを実行してみます。

Viewが作成されて、コンパイル変数に設定したデフォルト値123が列の値として出力されました。コンパイル変数を使えることが確認できてよかったです。
続いて、APIでコンパイル変数を上書きしてDataformワークフローを実行できるか確認してみます。

API実行してみる

DataformのAPI実行に関してよくわからない人は、このブログを見てみてください。
それではコンパイルをします。コンパイル用のコマンドは以下となります。

curl -X POST https://dataform.googleapis.com/v1beta1/projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/compilationResults \
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header "Content-Type: application/json" \
  --data '{"gitCommitish":"main", "codeCompilationConfig":{"vars":{"sample_val":"9999"}}}'

"codeCompilationConfig":{"vars":{"sample_val":"9999"}}:この部分が重要です。   コンパイル時に、コンパイル変数を上書きするためcodeCompilationConfigを設定し、コンパイル変数に999の値を設定しました。リファレンス
dataform.jsonで宣言したsample_val変数のデフォルト値に設定した値は123でしたが、上記コマンドでコンパイル時に9999を指定しました。
このコンパイル結果を元に実行して、作成されたViewの列の値が9999となっていれば検証は成功するという寸法です。
それではコンパイル結果を元にDataformワークフローを実行します。実行は以下のコマンドです。

 curl "https://dataform.googleapis.com/v1beta1/projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/workflowInvocations" \     
  --header "Authorization: Bearer $(gcloud auth print-access-token)" \
  --header 'Content-Type: application/json' \
  --data '{"compilationResult":"projects/*project-id*/locations/asia-northeast1/repositories/*repo-name*/compilationResults/75cb3271-4654-4ba3-88ad-1a3ac97d08e7"}'

compilationResultには、コンパイル用コマンドのレスポンスのnameの値を指定します。  

コマンドが成功したら、Dataformのコンソールから、実行されたかどうか確認してみます。
無事実行されていて、完了していました。
それではViewもみてみます。

9999が設定されていることが確認できました。

デフォルト値 コンパイル時の指定値
123 9999

上記としていたので、コンパイル時にdataform.jsonで定義したコンパイル変数の値をコンパイル時に上書きできることが確認できました!

所感

コンパイル時に、変数の値を上書きできるということはDataformをWorkflowsやCloud Functionsなどから呼び出す際にとても嬉しい機能だと考えます。日付を指定したり、前工程の処理結果を指定したり、環境(prod,stg)を指定したり、など。ワークロードによりけりですが、今後Dataformを活用する上ではぜひ覚えておきたい機能だと思いました。
この記事が、どなたかのお役に立てば嬉しいです。それではまた。

参考

カスタム コンパイル変数を作成する
コンパイル実行APIのリファレンス
Dataformワークフロー実行APIのリファレンス