Snowflake Knowledge - INSIGHT LAB

【Snowflake×dbt】dbt の Packages を使ってみた

作成者: 橋口|2022年12月20日

dbtとは

dbt (data build tool) は、データパイプラインを構築するためのツールです。データの前処理(ELT)におけるTransform(変換)を担当し、SELECT文を記述するだけでデータウェアハウス内のデータを変換できます。

公式リンク:https://www.getdbt.com/

公式ドキュメント:https://docs.getdbt.com/docs/introduction

Packages とは

dbt の Packages とは、Python のライブラリのようなもので、コードをモジュール化して後で簡単に実装できるようにしたものです。dbt Package 自体は単体の dbt プロジェクトで、それぞれモデルとマクロを備えています。プロジェクトにパッケージをインストールすると、パッケージのモデルとマクロが、自分のプロジェクトの一部になります。

  • つまり・・・
    • パッケージ内のモデルは "dbt run" を実行すると実体化される
    • 自分のモデル内で "ref" を使って、パッケージ内のモデルを参照できる
    • 自分のプロジェクト内で、パッケージ内のマクロを使用できる
今回は実際にパッケージをインストールして、中の機能を一部使ってみようと思います。


実行

Packages は dbt Package Hub の中から必要なものを選んでインストールすることができます。代表的な Packages だと、dbt_utils や codegen があります。

 

dbt_utils.get_column_values() 特定のリレーションの列の一意の値を配列として返します。
dbt_utils.get_relations_by_pattern() 指定されたスキーマ名またはテーブル名のパターンに一致する関係のリストを返します。
dbt_utils.deduplicate() モデル、ソース から重複行を削除するために必要な sql を返します。
codegen.generate_base_model() ベース モデルの SQL を生成し、それをモデルに貼り付けることができます。
codegen.generate_model_yaml() モデルのリストの YAML を生成し、これを schema.yml ファイルに貼り付けることができます。

 

今回は dbt Package Hub の中から dbt_snow_utils を使ってみようと思います。

インストール

まずはインストール。「dbt_project.yml」 と同じ階層に 「packages.yml」 を作成して、以下のように記述します。

保存して、コンソールで "dbt deps" コマンドを実行してインストール完了です。パッケージをいくつも追加したい場合もこのファイル内に続けて "- package: ~" と、追加したいパッケージを続けて記述して実行すればOKです。

dbt_snow_utils に機能はいくつかありますが、CLONEマクロとDELETEマクロを使用してみたいと思います。

dbt_snow_utils.clone_table

このマクロは、テーブルを宛先のデータベース、スキーマに複製します。引数は以下。

  • 引数
    • source_table(必須) : ソーステーブル名
    • destination_table(必須) : 宛先テーブル名
    • source_database(オプション) : ソースデータベース名
    • source_schema(オプション) : ソーススキーマ名
    • destination_database(オプション) : 宛先データベース名
    • destination_schema(オプション) : 宛先スキーマ名

 

今回は以下の 「ST_POST」 テーブルを複製しようと思います。

 

宛先はあらかじめ準備した以下のテーブル。中身は空です。 

 

実行コマンドと引数をコンソールに入力して実行。引数多い・・・。

 

Snowflakeを確認するとデータが入っていました。

 

Query History で実行されたクエリを確認すると、CREATE TABLE されているので、あらかじめテーブルを作る必要もないですね。

 

存在しないテーブルを宛先に指定して実行。

 

Snowflakeにはちゃんとテーブル作成されていました。

 

次にオプションの引数を消して実行してみます。

 

dbt でデフォルトで設定しているデータベースとスキーマにテーブルが作成されました。

 

dbt_snow_utils.delete_records_by_column

このマクロはWhere句に基づいてテーブルからデータを削除します。引数は以下。

引数
  • del_key(必須) : 削除のWHERE句の列名
  • del_value(必須) : 削除のWHERE句の列名の値
  • database(オプション) : データベース名
  • schema(オプション) : スキーマ名
  • table(オプション) : テーブル名

 


今回は先ほど作成した以下の 「FT_POST_DBT」 テーブルからデータを削除してみようと思います。

先ほどと同様に、実行コマンドと引数をコンソールに入力して実行。

 

データを確認すると "code=3" のレコードが削除されていました。

Query History を確認すると、ちゃんとDELETE文が実行されていました。

 

まとめ

今回は dbt Packages の中から dbt_snow_utils のパッケージを使用してみました。似たようなパッケージで snowflake_utils や データマスキングのための dbt_snow_mask など、他にも様々なパッケージがあります。使ってみたらまた記事にしようと思います。