GCP版Dataformのコード再利用機能を触ってみた
投稿者:今井
初めに
こんにちは。GCP 版 Dataform の Dependency Tree 機能の実装を今か今かと待ちわびているCI部の今井といいます。
以前も執筆した GCP 版 Dataform のテックブログに続いて、Dataformを触ったあとにさらなる機能を利用したい人がいるのではと考えて、今回は GCP 版 Dataform で利用することのできるコード再利用機能をご紹介したいと思います。
最後までご覧いただければ幸いです。
Dataform のコード再利用機能とは
まず初めに、 Dataform のコード再利用機能とは何かをざっくりと説明させていただきます。
Dataform の公式ドキュメントでは以下のように説明しています。(日本語に勝手に翻訳しています)
JavaScript ファイルを includes フォルダに追加して、プロジェクト全体で再利用できる定数、簡単なスクリプト、マクロを定義することができます。
includes フォルダ内の各ファイルは、他の SQL ファイルや JavaScript ファイルで使用できるようになります。
BigQuery では正式に実装されている機能としては簡単なスクリプト(UDF)しかありません。
その他の定数を設定する機能は UDF 機能で固有値を返却するように作るしかないため、代替機能はないと言えると思います。
また、マクロ機能も BigQuery にはないため、Dataform が優位な点ではと思います。
今回は公式ドキュメントの機能をそのまま使って例を出していきたいと思います。
定数を定義する
Dataform では Javascript ファイルを使って、定数を定義することで、プロジェクトの中の SQL や Javascript で利用することができます。
利用するときは ${} で囲む必要があります。
まずはプロジェクトの ID を定数として利用できるような Javascript ファイルをincludesフォルダ内にconstants.jsというファイル名で作成します。
この時、定数として出力したい変数をmodule.exports = { }の{ }の中に書いておきます。
const PROJECT_ID = "my_project_name";
module.exports = { PROJECT_ID };
上で作成した Javascript ファイルを他の SQLX ファイルで利用するようにした結果が以下の画像のようになります。
左側で書いた ${constants.PROJECT_ID} が右側のコンパイルされた SQL になるとmy_project_nameに置き換わっていることがわかります。
簡単なスクリプト①を定義する
Dataform での簡単なスクリプトでは0個以上のパラメータを与えて、結果として文字列を返さなければならないという制約があります。
そしてこのスクリプトは同じSQLロジックブロックをすべての SQL ファイルで再利用することができます。
今回は 2 文字の国名をスクリプトに与えることで、その国が所属している地域を返す条件文のスクリプトをincludesフォルダ内にcountry_mapping.jsというファイル名で作成します。
そして、このスクリプトの中で作成するファンクションの名前はcountryGroupとしたいと思います。
function countryGroup(countryCodeField) {
return `CASE
WHEN ${countryCodeField} IN ("US", "CA") THEN "NA"
WHEN ${countryCodeField} IN ("GB", "FR", "DE", "IT", "PL") THEN "EU"
WHEN ${countryCodeField} IN ("AU") THEN ${countryCodeField}
ELSE "Other countries"
END`;
}
module.exports = { countryGroup };
上で作成した Javascript ファイルを他の SQLX ファイルで利用するようにした結果が以下の画像のようになります。
左側で書いた ${country_mapping.countryGroup(“country_code”)} が右側のコンパイルされた SQL になると上で書いた CASE 文に置き換わっていることがわかります。
さらに、 CASE 文で書いている countryCodeField が country_code に変わっていることがわかります。
このスクリプトを他の SQL ファイルでも流用することで毎回 CASE 文を書くのではなくスマートに SQL を書くことができるようになり、視認性も向上すると思います。
簡単なスクリプト②を定義する
Dataform でのマクロもスクリプト同様 0 個以上のパラメータを与えて、文字列を返さなければならないという制約があります。
以下の例では、グループ化するフィールドの数を入力として受け取って、対応する GROUP BY 文を生成する groupBy() というファンクションをincludesフォルダ内にutils.jsというファイル名で作成します。
function groupBy(n) {
var indices = [];
for (var i = 1; i <= n; i++) {
indices.push(i);
}
return `GROUP BY ${indices.join(", ")}`;
}
module.exports = { groupBy };
上で作成した Javascript ファイルを他の SQLX ファイルで利用するようにした結果が以下の画像のようになります。
左側で書いた ${utils.groupBy(5)} が右側のコンパイルされた SQL になると GROUP BY 1, 2, 3, 4, 5 に置き換わっていることがわかります。
この機能を使うことにより、数字を変更するだけで毎回 GROUP BY を書く必要がなくなります。
最後に
今回、作成した Javascript ファイルは公式ドキュメントに載っているものになります。
皆さんの環境で必要な機能は異なると思いますので、本ブログがその機能の作成の際のご参考になれば幸いです。
よい Dataform ライフをお過ごしください。
ご一読ありがとうございました。