目次
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 など、他にも様々なパッケージがあります。使ってみたらまた記事にしようと思います。
- 参考
- dbt - Packages : https://docs.getdbt.com/docs/build/packages
- dbt - Package Hub : https://hub.getdbt.com/
- dbt_snow_util : https://hub.getdbt.com/entechlog/dbt_snow_utils/latest/