はじめに
公式ドキュメントであるQuickstart for dbt Cloud and Snowflakeをやってみたdbt初心者です。
ドキュメントに沿って進めていくうちに、先に知っておけばよかったな~と思った事などをメモしています。
dbt初心者の助けになるはず!
クイックスタートで出来ること
ドキュメント通りですが以下のようにSnowflakeとの接続からdbtのモデル作成、ジョブ実行まで一連の流れを体験できます。
・新しいSnowflakeワークシートを作成します。
・サンプルデータをSnowflakeアカウントにロードします。
・dbt CloudをSnowflakeに接続します。
・サンプルクエリをdbtプロジェクトのモデルにします。
・dbtプロジェクトにソースを追加します。
・モデルにテストを追加します。
・モデルを文書化します。
・ジョブの実行をスケジュールします。
1.事前準備
・Snowflakeトライアルアカウント作成
Snowflake無料トライアル環境の期限は30日です。
・dbtアカウント作成
今回はdbt Cloudを使用します。プランは「Developer」を選択しました。
「Developer」プランでアカウントを作成後14日間は「Team」プランのトライアル環境になるようです。
「Developer」プランでAPIを使う場合の注意点
「Developer」プランにはAPIアクセスの機能を持ち合わせていない為、「Team」プランのトライアル期間(14日)を過ぎるとAPIを使用できません。
2.Snowflakeのワークシートの作成は「+」をクリックしたら完了ですので割愛します
3.データのロード(Snowflakeの準備)
必要なものを作成
・ウェアハウス
dbtで作成したモデルを実行するウェアハウスを作成
・データベース
RAWデータ用とdbt開発用に分けて作成
・スキーマ、テーブル
RAWデータ用のみ作成
Snowflakeワークシートの使い方について
ドキュメントでは以下のように、実行後SQLのコードは削除するよう記載されていますが、ワークシート内の選択箇所のみ実行出来るため削除しなくても良いです!
First, delete all contents (empty) in the Editor of the Snowflake worksheet. Then, run this SQL command to create the customer table:
サンプルデータをロードする
S3に格納されているサンプルデータをロードします。ロードにはCOPYコマンドを使用しています。実行後はきちんとデータが入っているか確認しておくことをオススメします。
4.Snowflakeとdbtを接続する
接続する方法は2種類あります。
今回はdbt Cloudから手動で接続する Connect manuallyにしました。
アカウント識別子について
鎖マークを選択しアカウントURLをコピー以下xxx
の部分です
https://XXXXXXXX
.snowflakecomputing.com
ほか認証情報を入力し完了です!
5.dbtCloudのリポジトリの設定
ドキュメントの通りです。ここまでくれば準備は完了です!
6.dbtで開発をはじめよう
はじめに知っておくといいこと
・モデル=SQLファイルのこと
・開発ページは「Develop」
・モデル(ファイル)の名前には拡張子までつける (yml,sqlなど拡張子で判断)
・実行はdbt run
・指定したモデルだけ実行したい場合はdbt run --select モデル名.sql
・SQLのコードの文末に「;」を付けない
7.はじめてのモデル作成
ブランチ作成
バージョン管理のためにブランチをします。ブランチ名はadd-customers-model
のように、これからどんな対応を入れるのかを記載します。
対応をひと言で説明するのが難しい場合や、案件ではjiraのチケット番号と紐づける等の工夫をするみたいです。
モデル作成時に助かる便利ポイント
プレビュー機能があります!モデル内の一部を選択し実行することでデータを確認できます。当たり前かもしれませんが、SnowflakeのGUIを使用せずdbtだけでデータマート開発が出来るなんて、感動
8.モデルのmaterializedを変更
materializedについて
モデルで何を作るのか決めることが出来ます。
詳細については別の記事を投稿しようと思うのでここでは紹介のみとします。
種類
・table
・view
・incremental
・ephemeral
・materialized view
設定方法
materializedの設定方法は2種類あります。
①ymlファイルで一括設定
②モデルごとに指定
モデルによってmaterializedを変える場合はこちらが良さそうですね
dbt run
をしてみるとSnowflake上に成果物が出来ているはずです!
9.exampleモデルを削除します。ドキュメント通りなので割愛します。
10 モデルに依存関係を持たせよう
stg_cusomers
とstg_orders
を参照したcusomers
モデルを作成します。
モデルを参照する場合はref()
を使用します。cusomers
モデルは以下のようになります。
with customers as (
select * from {{ ref('stg_customers') }}
),
orders as (
select * from {{ ref('stg_orders') }}
),
customer_orders as (
select
customer_id,
...
11 データソースをsourceとして認識させる
これまではfrom句でテーブルを直接指定していましたが source関数
を使ってみます。
手順
①ymlファイルにデータソースとなるテーブルを定義
②from句を変更する from {{ source('スキーマ名', 'テーブル名') }}
便利ポイント
リネージュ機能を確認すると依存関係も一目で確認できます
これによりモデルがSnowlfakeのどのテーブルから作られているのかが分かるようになります 便利!
実行結果をSnowflakeでも確認してみる
Snowflakeでテーブルcustomers
が作成されていることを確認できました
12.テスト
model
ディレクトリ配下にschema.yml
ファイルを作成しテストを行います。
各テーブルのカラムに対してテスト観点を記載します。
version: 2
models:
- name: customers
columns:
- name: customer_id
tests:
- unique
- not_null
- name: stg_customers
columns:
- name: customer_id
tests:
- unique
- not_null
ここまでドキュメント通りに進めていたはずがテストでエラーになりました
(わたしのミスです)
エラーメッセージを頼りにSnowflakeを見るとmy_first_dbt_model
のid
がnullになっていました。
前項9で削除したはずのexample
モデルが削除できていなかった事が原因でした。解決
ということでmodel/
にある全てのモデルがテスト対象になります。
再テスト
ymlファイルで定義したテスト観点ごとに確認をしていることが分かります。
13,14はドキュメントの通りに進めました。
15.dbtをデプロイする(ジョブを作ろう)
デプロイ環境を作成したうえでジョブを作成し実行します。
以下がジョブを実行した結果です!成功!
最後に所感
dbtは"T"に集中できる環境だと感じました。
データマート開発時に感じるちょっとした嫌なことが解消されているような気がします
はじめはdbtって何が出来るの?何がすごいの?と思っていましたが、触っていくうちにdbtの便利さに気付き感動していました 本当に奥が深くまだまだ分からない事ばかりです。
dbtが私たちの代わりにやってくれたことを実際にSnowflakeではどのようなクエリとして実行されていたのか等、検証した内容を少しずつ投稿していこうと思います。