🙄

dbtでUDFをcustom materializationを使って管理する

2024/12/04に公開

こんにちわ! @mashiike です。

2024年のdbt Advent Calenderも盛り上がってきましたね。
4日目の今日、@Y4M4MOTO さんがこちらの記事を公開しました。

https://tech.yappli.io/entry/managing-bigquery-udf-with-dbt-macro

こちらの記事について、X上で私が このようにPostしたところ、リプライをいただきました。
そこで、サンプルリポジトリをサクッと書いたので、そのリポジトリの内容の簡単な解説記事になります。
https://x.com/mashiike/status/1864155336837616111

サンプルの内容

サンプルで作ったリポジトリとしては、こんな感じです。
README.mdにあるようにPoC的なやつです。

https://github.com/mashiike/dbt_udf
※パッケージ化してますけど、macrosの中身を丸パクリしても動きます。

骨子になる部分は、こちらのmacors/materializations/udf.sqlになります。

https://github.com/mashiike/dbt_udf/blob/main/macros/materializations/udf.sql

これは、Custom Materializationというやつで、昔TechBlogに解説記事を書いてたので詳しくはそちらを参照していただければ幸いです。

https://techblog.kayac.com/dbt-custom-materialization

どんな機能かというと、いつも materialized='<type>' 指定している部分で新しい独自のtypeを追加するという機能です。今回のこれは materialized='udf' と指定できるようしてます。

さて、これをどうやって使うかというと、以下のようになります。

SQL UDF:
https://github.com/mashiike/dbt_udf/blob/main/integreation_tests/models/udfs/f__today.sql

Javascript UDF:
https://github.com/mashiike/dbt_udf/blob/main/integreation_tests/models/udfs/f__multiply.sql

今のままだと、Optionsとかには対応してないので、そのへんを改良したければ、macros/relations/udf/create.sql をいじると良いです。

UDFを使ってる側は、このようになります。

https://github.com/mashiike/dbt_udf/blob/main/integreation_tests/models/example/example.sql

実行の様子

$ dbt build
05:40:31  Running with dbt=1.8.9
05:40:32  Registered adapter: bigquery=1.8.3
05:40:32  Found 3 models, 488 macros
05:40:32  
05:40:34  Concurrency: 15 threads (target='bigquery')
05:40:34  
05:40:34  1 of 3 START sql udf model dbt_udf.f__multiply ................................. [RUN]
05:40:34  2 of 3 START sql udf model dbt_udf.f__today .................................... [RUN]
05:40:35  1 of 3 OK created sql udf model dbt_udf.f__multiply ............................ [None (0 processed) in 1.07s]
05:40:36  2 of 3 OK created sql udf model dbt_udf.f__today ............................... [None (0 processed) in 1.32s]
05:40:36  3 of 3 START sql view model dbt.example ........................................ [RUN]
05:40:37  3 of 3 OK created sql view model dbt.example ................................... [CREATE VIEW (0 processed) in 1.04s]
05:40:37  
05:40:37  Finished running 2 udf models, 1 view model in 0 hours 0 minutes and 4.32 seconds (4.32s).
05:40:37  
05:40:37  Completed successfully
05:40:37  
05:40:37  Done. PASS=3 WARN=0 ERROR=0 SKIP=0 TOTAL=3

あとは、dbt docsのリネージグラフを見ると、この様になります。

メリデメ的な話

この方法のメリットはいくつかあります。

  • 環境の切り替えがdbtのネイティブな感じにできる。
  • リネージグラフになんかのる。

デメリットとしては、大きいところだと

  • なんで動いてるのかを理解するのが難解。(dbtの仕組みを深く知ってる必要)

という感じになると思います。
あくまで管理方法の一例なので、組織やプロダクトの状態に合わせて、採用すると良いと思います。

Discussion