■ はじめに
DBT の pre-hook/post-hook について学んだのでメモ
目次
【1】公式ドキュメント 【2】Hooks 1)pre-hook 2)post-hook 【3】Hookの設定方法 1)モデル内に設定する 2)dbt_project.yml 内に設定する 3)models/properties.yml 内に設定する 【4】サンプル 例1:モデルのバックアップ作成 例2:Snowflake の 仮想ウェアハウスを切り替える
【1】公式ドキュメント
* 以下、参照。
https://docs.getdbt.com/docs/build/hooks-operations
https://docs.getdbt.com/reference/resource-configs/pre-hook-post-hook
【2】Hooks
* 実行前・後のイベントハンドラ * seedやsnapshotでも使用可能 * SQL文だけでなく、Macroなども呼び出すことは可能
1)pre-hook
* model作成直前にクエリを実行できる
2)post-hook
* model作成直後にクエリを実行できる
【3】Hookの設定方法
* 公式ドキュメントに記載されている
https://docs.getdbt.com/reference/resource-configs/pre-hook-post-hook
1)モデル内に設定する
{{ config( post_hook=["{{ your_macro() }}"] ) }}
2)dbt_project.yml 内に設定する
models: schama: demo_schema +post-hook: "{{ your_macro() }}"
3)models/properties.yml 内に設定する
models: - name: demo_model config: post_hook: "{{ your_macro() }}"
【4】サンプル
* 公式ドキュメントのサンプルは以下。
https://docs.getdbt.com/docs/build/hooks-operations#additional-examples
例1:モデルのバックアップ作成
* dbt run すれば、モデル作成後、 そのテーブルのバックアップ(_bk)を作成される => pre_hook の DROP は実際にはやっちゃだめだけど。 (あくまでデモとして実装しただけ)
models/customers.sql
{{ config( alias='hello', schema='demo_schema', database='sample_db', materialized='table', pre_hook=["{{ clean_backup('customers') }}"], post_hook=["{{ backup('customers') }}"] ) }} select 1 as id, 'Mike' as name, '{{ var("remark", "hello_world") }}' as remark, now() as insert_at
macros/clean_backup.sql
{%- macro clean_backup(table_name) %} DROP TABLE IF EXISTS {{ table_name }}_bk {% endmacro %}
macros/backup.sql
{%- macro backup(table_name) %} CREATE TABLE IF NOT EXISTS {{ table_name }}_bk AS SELECT * FROM {{ table_name }} {% endmacro %}
例2:Snowflake の 仮想ウェアハウスを切り替える
{{ config( pre_hook=["{{ init('demo_table') }}"] ) }}
macros/init.sql
{%- macro init(table_name, warehouse_size='DEMO_WH_XS') %} {{ return(adapter.dispatch('init')(table_name, warehouse_size)) }} {% endmacro %} -- For default {% macro default__init(table_name, warehouse_size) -%} {{ log("Skip init for " ~ table_name) }} {%- endmacro %} -- For Snowflake {% macro snowflake__init(table_name, warehouse_size) %} USE WAREHOUSE {{ warehouse_size }}; -- 例えば、テーブル件数によって -- Warehouseサイズを切り変えるみたいなこともできる {% endmacro %}
参考文献
https://dev.classmethod.jp/articles/dbt-hooks/
https://zenn.dev/foursue/books/31456a86de5bb4/viewer/2d919d
関連記事
dbt ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2023/06/30/000000
dbt ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/05/30/151003
dbt ~ 基本編 / Model ~
https://dk521123.hatenablog.com/entry/2023/11/25/231128
dbt ~ 基本編 / Seed ~
https://dk521123.hatenablog.com/entry/2023/11/20/230946
dbt ~ 基本編 / Source ~
https://dk521123.hatenablog.com/entry/2023/12/08/111012
dbt Macro ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/11/29/003751
dbt ~ ドキュメント化 / dbt docs ~
https://dk521123.hatenablog.com/entry/2023/12/10/125512
dbt ~ aliases ~
https://dk521123.hatenablog.com/entry/2023/12/13/031018
dbt Macro ~ DWHごとに処理切替 / adapter.dispach ~
https://dk521123.hatenablog.com/entry/2024/08/20/150724