【dbt】dbt ~ Hooks ~

■ はじめに

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