Dataformでresolve関数を使って依存関係を持たせずにテーブル参照する
概要
DataformでSQL内でテーブルを参照する時は多くの場合ref関数
を用いると思います。
ref関数を用いることでDataformが各SQLの依存関係を解決してくれて、
データパイプラインを自動で組んでくれます。
でも、時にはSQLでテーブルを使用するけど依存関係を持たせたくない、そんな時もあると思います。
その時に役に立つのがresolve関数
なのです。
resolve関数
は、DataformのSQLXファイル内でテーブル参照の時に用いる関数です。
この関数を用いてSQLを実装すると、Dataformは依存関係を設定しません。
以下に例を出します。3つのSQLを用意しました。
config {
type: "table",
}
SELECT "test_1 table" AS col_1
config {
type: "table",
}
SELECT "test_2 table" AS col_1
config {
type: "table",
}
SELECT * FROM ${ref("dataset_name", "test_1")}
UNION ALL
SELECT * FROM ${ref("dataset_name", "test_2")}
上記をDataformに実装してDAG(COMPILED GRAPH)を見てみます。
上記の通り、test_3.sqlxはtest_1、test_2.sqlxファイルに依存しているのがDAGとして表現されています。
これはtest_3.sqlx内でref関数を用いて各テーブルを参照しているからです。
resolve関数を試してみる
resolve関数
もref関数と使い方は同様です。
SQLXのSQL内で使用するのであれば${resolve("テーブル名")}
で使用することができます。
また、データセットやデータベースを指定することができますし省略した場合は
デフォルトの設定が使用されます。
先ほどのtest_3.sqlxのref関数をresolve関数に置き換えた例が以下です。
config {
type: "table",
}
SELECT * FROM ${resolve("test_1")}
UNION ALL
SELECT * FROM ${resolve("test_2")}
上記のSQLXを作成したのでDAGを見てみます。
先ほどのref関数を用いた場合と異なり、依存関係がなくなり全てが並列で処理される
ようになっているのが確認できます。
resolve関数を用いると、SQLXファイル間の依存関係を設定することなくテーブルを
参照することができるのがわかりました。
まとめ
使用ポイントは以下となります。
関数名 | 使用ポイント |
---|---|
ref関数 | SQLで依存関係を持たせてテーブルを使いたい時 |
resolve関数 | SQLで依存関係を持たせたくないテーブルを使いたい時 |
ref、resolve関数を用いてDataformを実装すると依存関係が設定される、
動的にスキーマを指定できるなどメリットばかりです。うまく使い分けて実装していきたいですね。
またSQL内で使わないけど依存関係持たせたい、という場合は以下の記事をご参照ください。
それではまた。ナマステー
参考