Dataformでresolve関数を使って依存関係を持たせずにテーブル参照する

Dataformでresolve関数を使って依存関係を持たせずにテーブル参照する

Dataformでは、ref関数を使ってSQL間の依存関係を設定できますが、依存関係を持たせたくない場合はresolve関数を使用します。この記事ではresolve関数の使い方などをご説明しています。
Clock Icon2024.09.13

概要

DataformでSQL内でテーブルを参照する時は多くの場合ref関数を用いると思います。
https://dev.classmethod.jp/articles/dataform-dependencies/

ref関数を用いることでDataformが各SQLの依存関係を解決してくれて、
データパイプラインを自動で組んでくれます。

でも、時にはSQLでテーブルを使用するけど依存関係を持たせたくない、そんな時もあると思います。
その時に役に立つのがresolve関数なのです。

resolve関数は、DataformのSQLXファイル内でテーブル参照の時に用いる関数です。
この関数を用いてSQLを実装すると、Dataformは依存関係を設定しません。
以下に例を出します。3つのSQLを用意しました。

test_1.sqlx
config {
  type: "table",
}
SELECT "test_1 table" AS col_1
test_2.sqlx
config {
  type: "table",
}
SELECT "test_2 table" AS col_1
test_3.sqlx
config {
  type: "table",
}
SELECT *  FROM ${ref("dataset_name", "test_1")} 
UNION ALL
SELECT * FROM ${ref("dataset_name", "test_2")}

上記をDataformに実装してDAG(COMPILED GRAPH)を見てみます。
スクリーンショット 2024-09-13 19.31.34
上記の通り、test_3.sqlxはtest_1、test_2.sqlxファイルに依存しているのがDAGとして表現されています。
これはtest_3.sqlx内でref関数を用いて各テーブルを参照しているからです。

resolve関数を試してみる

resolve関数もref関数と使い方は同様です。
SQLXのSQL内で使用するのであれば${resolve("テーブル名")}で使用することができます。
また、データセットやデータベースを指定することができますし省略した場合は
デフォルトの設定が使用されます。
先ほどのtest_3.sqlxのref関数をresolve関数に置き換えた例が以下です。

test_3.sqlx
config {
  type: "table",
}
SELECT *  FROM ${resolve("test_1")} 
UNION ALL
SELECT * FROM ${resolve("test_2")}

上記のSQLXを作成したのでDAGを見てみます。
スクリーンショット 2024-09-13 19.53.35

先ほどのref関数を用いた場合と異なり、依存関係がなくなり全てが並列で処理される
ようになっているのが確認できます。

resolve関数を用いると、SQLXファイル間の依存関係を設定することなくテーブルを  
参照することができるのがわかりました。

まとめ

使用ポイントは以下となります。

関数名 使用ポイント
ref関数 SQLで依存関係を持たせてテーブルを使いたい時
resolve関数 SQLで依存関係を持たせたくないテーブルを使いたい時

ref、resolve関数を用いてDataformを実装すると依存関係が設定される、
動的にスキーマを指定できるなどメリットばかりです。うまく使い分けて実装していきたいですね。

またSQL内で使わないけど依存関係持たせたい、という場合は以下の記事をご参照ください。
https://dev.classmethod.jp/articles/20240909-dataform-dependencies/

それではまた。ナマステー

参考

https://cloud.google.com/dataform/docs/define-table?hl=ja#reference_other_tables_with_resolve

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.