■ はじめに
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