WorkflowsからDataformを起動してみた
データアナリティクス事業本部の根本です。WorkflowsからDataformを起動してみました。とっても便利なDataformですが、WorkflowsからDataformが起動できるとDataformの活用の幅が一段と広がると思います。
さらに活用の幅を広げるためにいくつか検証してみました!
この記事の対象者
- DataformをWorkflowsから起動したいひと
前提条件
- Dataform、Workflowsが使用できること。
- Dataformワークスペース、リポジトリが作成済みであること
検証の全体像
- DataformのワークフローをWorkflowsから起動できるかどうか
- Dataformのワークフローをタグ指定で起動できるかどうか
- Dataformのワークフローをコンパイル変数をWorkflowsで上書きして起動できるか
上記の3点を検証していきます。
やってみる
まずはDataformの準備をします。実行するSQLXとdataform.jsonファイルを作成します。
config { type: "view", tags: ["dataform_tag_test"] } SELECT ${dataform.projectConfig.vars.compile_val} AS compile_col
上記SQLXファイル(workflows_call_test.sqlx)は、実行するとBig Queryのデータセット内にworkflows_call_test
という名前でViewを作成します。
{ "defaultSchema": "データセット名", "assertionSchema": "dataform_assertions", "warehouse": "bigquery", "defaultDatabase": "プロジェクトID", "defaultLocation": "asia-northeast1", "vars": {"compile_val":"'workflows_test'"} }
dataform.jsonファイルでは、コンパイル変数で変数名compile_val
としてworkflows_test
という文字列をデフォルト値に設定しています。
注意点として、コンパイル変数の値として文字列を設定するときはダブルクォーテーションで囲んだ後にシングルクォーテーション囲む必要があります。
dataform.jsonファイル内で、コンパイル変数に設定する値をダブルクォーテーションのみで文字列を囲み値を設定してしまうと、SQLXファイルの実行に失敗します。
"vars": {"compile_val":"workflows_test"}
Unrecognized name: workflows_test at [2:8]
SQLX中でコンパイル変数を使用するときはSQLX内で、JavaScriptの変数として使用するのですがコンパイル変数の宣言時に"workflows_test"
で初期化をするとSQLX実行時には以下の状態となります。
SELECT workflows_test AS compile_col
workflwos_test
という変数として扱われてしまうため、認識できない名前です、というようなエラーメッセージが出力されて実行に失敗します。
変数として解釈されないように文字列にしたいので、コンパイル変数の宣言時に"'workflows_test'"
というようにシングルクォーテーションで囲み初期化をすると
SELECT 'workflows_test' AS compile_col
文字列'workflows_test'
として解釈されるため、SQLXの実行に成功します。
ちょっとした詰まりポイントかなと、個人的には思います。
Dataformワークフローをそのまま実行してみる
準備が整ったので検証を開始します。
まずはDataformをブランチ名指定で呼び出して実行します。
以下がWorkflowsのファイル内容です(公式リファレンス)をもとに作成しています)。DataformのAPI実行の流れが不明な場合はこちらをご参照ください。
main: steps: - init: assign: - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名* - createCompilationResult: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"} auth: type: OAuth2 body: gitCommitish: "main" result: compilationResult - createWorkflowInvocation: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"} auth: type: OAuth2 body: compilationResult: ${compilationResult.body.name}
gitCommitish: "main"
にて、mainブランチを指定してコンパイルを行っています。
Workflowsを実行して成功していたので、Big Queryのコンソールから確認してみます。
View名:workflows_call_test
列の値:workflows_test
となっておりました。workflows_test
はdataform.jsonで宣言したコンパイル変数の値なので期待通りの結果でした!
タグ指定してDataformワークフローを起動してみる
通常の起動が成功したので、続いてタグ指定でDataformワークフローを起動してみます。
main: steps: - init: assign: - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名* - createCompilationResult: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"} auth: type: OAuth2 body: gitCommitish: "main" result: compilationResult - createWorkflowInvocation: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"} auth: type: OAuth2 body: compilationResult: ${compilationResult.body.name} invocationConfig: includedTags: - "dataform_tag_test"
Dataformワークフロー呼び出し時の設定を追加しました。具体的には以下の箇所です。
invocationConfig: includedTags: - "dataform_tag_test"
invocationConfig
にて呼び出し時の設定でタグdataform_tag_test
を指定しています。
Workflowsを実行して成功していたので、実際にタグ指定で起動できたのかDataformの実行結果画面から確認してみます(今回の実装だと実行結果は同じViewが作成されるだけなので)。
実行結果画面にてタグ: dataform_tag_test
としてワークフローが起動されていることが確認できました。期待通りの結果です。
コンパイル変数の値を上書きしてDataformワークフローを実行してみる
最後に、Workflows側でコンパイル変数の値を上書きしてDataformワークフローを起動してみます。
main: steps: - init: assign: - repository: projects/*プロジェクトID*/locations/asia-northeast1/repositories/*リポジトリ名* - createCompilationResult: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/compilationResults"} auth: type: OAuth2 body: gitCommitish: "main" codeCompilationConfig: { vars: { compile_val:"'dataform_test'" } } result: compilationResult - createWorkflowInvocation: call: http.post args: url: ${"https://dataform.googleapis.com/v1beta1/" + repository + "/workflowInvocations"} auth: type: OAuth2 body: compilationResult: ${compilationResult.body.name}
コンパイル時に、コンパイル変数を設定する処理を追加しました。具体的には以下の箇所です。
codeCompilationConfig: { vars: { compile_val:"'dataform_test'" } }
dataform_test
という値を、コンパイル変数(compile_val
)に設定しています。compile_val
の初期値はworkflows_test
を設定していましたが、今回のWorkflows実行時にはdataform_test
を設定して上書きをしています。
Workflowsを実行して成功していたので、Big QueryのViewを確認してみます。
dataform_test
が値に設定されていることが確認できました。この値はWorkflowsの処理でコンパイル変数へ設定していた値です。
よってコンパイル変数をWorkflows実行時に上書きしてDataformワークフローを実行できることが無事確認できました!
おわりに
今回のWorkflowsからのDataform検証を通して、以下のことが確認できました。
- WorkflowsからDataformワークフローを起動できる
- WorkflowsからDataformワークフローをタグ指定で起動できる
- WorkflowsからDataformワークフローのコンパイル変数を上書きして起動できる
Dataformを用いて処理を行う場合に、Workflowsから扱うことができ、且つコンパイル変数を上書きして使うことができる、タグ指定で実行できるというのはとても心強い機能だと思います。今後Dataform、Workflowsを活用していく上で活かしていきたいと思います。
この記事が誰かのお役に立てば幸いです。それではまた。
参考
Workflowsリファレンス
カスタム コンパイル変数を作成する
コンパイル実行APIのリファレンス
Dataformワークフロー実行APIのリファレンス