dbt Cloud を学んでみる - モデルの作成・実行をしてみました

前回 [dbt Cloud のセットアップが完了](https://qiita.com/ny94/items/4e5202d85035e8a79508) したので、さっそくモデルを作成・実行してみたいと思います。

# モデルとは
モデルはdbtの中心的な概念です。
実行する変換処理の定義のことで、select文で記述します。

https://zenn.dev/dbt_tokyo/books/537de43829f3a0/viewer/models_doc
モデルについてはこちらの記事にまとめられており、とてもためになりました。

とはいえやはり動かしてみた方が分かりやすいので、自分のように初学者の方はここではスタートとして最低限必要なところだけつまみ
__SELECT文に名前を付けて保存できて、「dbt run」等のコマンドでdbtに実行させると、ビューもしくはテーブルの形でウェアハウス上に構築してくれる__ 
と理解して進めてしまいます。

細かいところでは、
* モデルは.sqlファイルで定義する
* 1つの.sqlファイル ＝ 1つのモデル ＝ 1つのSELECT文
* ファイルの名前 ＝ モデル名

も頭に置いておくと、イメージしやすくなると思います。


# モデルを作成・実行してみる
以下の流れで進めます。

1. （準備）サンプルデータの用意
2. （準備）プロジェクトの初期化
3. モデル作成
4. モデル実行

## 1. （準備）サンプルデータの用意
データが無いことには変換処理を試せません。
dbtがサンプルデータを提供してくれているので、[クイックスタート](https://docs.getdbt.com/docs/quickstarts/dbt-cloud/snowflake)に沿って準備しておきます。
詳細は割愛しますが、以下のようにデータベース／スキーマ／テーブルを用意し、それぞれのテーブルにデータをロードしました。
<img width=60% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/f84b495f-ef36-63f1-06ee-1a7d986faf19.png">

## 2. （準備）プロジェクトの初期化
セットアップが完了すると、DevelopタブからIDE画面が開けるようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/9556617a-0fc9-4f3e-302c-e2572ab9748c.png)
　　↓

「initialize dbt project」で、プロジェクト構造が自動で作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/5f05cdf7-9505-5924-27d9-c2f419a9aa6b.png)
このプロジェクト内のファイルが、セットアップ時に連携したリポジトリにてバージョン管理されます。
一度初期状態でコミットしておきます。操作はIDEの画面から可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/8ab7a4f9-f1ef-0ede-f9ba-bd674911482e.png)
　　↓
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/58bc7401-760e-e2e1-59ec-be9229c083ee.png">
　　↓

いよいよモデルを作成していくのですが、初期状態ではmasterブランチが選択されています。
dbtは作業ブランチを作成しての作業が可能なので、ブランチを作成していきます。
この操作も、IDEの画面から可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/f92dd98a-24fb-45e8-9dcf-0d811d45ccfb.png)
　　↓
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/db2120b7-bab5-059f-7d8f-25eac385ce1b.png">
　　↓
ブランチが作成され、選択された状態になっています。
このブランチで、モデルの作成をしていく…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/1beb08aa-8f24-1146-f5c3-93421b653d11.png)

のですが、実は自動で作成されたプロジェクト構造の中の「dbt_project.yml」が、プロジェクト全体の設定ファイルになっています。
プロジェクトの開始に伴い、一番上の ```name:``` にプロジェクト名を設定してから始めることにするのが良いと思います。（クイックスタートに沿って'jaffle_shop'としました）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/75e6084f-0682-7d08-4e8b-81845d696fdc.png)

## 3. モデル作成
modelsフォルダの中に、新規の.sqlファイルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/0e4b6d17-b989-c02e-61d1-0c02ee912178.png)
　　↓
<img width=25% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/ef854dd8-5c62-b388-adbd-2ee9cc675627.png">
　　↓

ファイル名 ＝ モデル名なので、ここでは『customers』というモデルを作成しています。
<img width=50% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/7b8385e4-c0d0-eab4-5783-87bdb25ef3d8.png">

作成した .sqlファイルに、コードを記述して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/54a0cbdf-fd94-a746-5d34-d4024f8bae8a.png)
今回はサンプルコードを貼り付けただけですが、内容は
```SQL:customers.sql
with customers as (

    select 
        id as customer_id,
        first_name,
        last_name
    from raw_db.jaffle_shop.customers

),

-- //途中省略

select * from xxx

```
と、WITH句（名前付きサブクエリ）と SELECT文 になっていて、このSELECT結果がテーブルまたはビューになります。

## 4. モデル実行
モデルを作成して保存したら、画面下のコマンド欄に「dbt run」と入力してEnterキーで実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/ca58528c-e6b3-6824-f3eb-f500707bead5.png)
　　↓

実行が正常終了するとこのような画面になりました。
「my_first_dbt_model」「my_second_dbt_model」は、初期化時に作成されたサンプルモデルです。
「dbt run」実行時に特にモデルを指定していない限りは、modelsフォルダ配下の全てのモデルが実行されるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/83ff4cd9-3bd3-118f-cc2b-f55c2db318bf.png)
　　↓

Snowflake の方を見ると、期待通りにビューが作成されていました。
* 作成先はセットアップ時に指定したデータベース、スキーマ
* モデル名は .sqlファイル名
* 作成されるオブジェクトはデフォルトではビューになるとのことで、今回は何も指定しなかったのでビューで作成されている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/b9031e8b-64ef-6eb8-ac4c-513054d9d104.png)
中身のデータも確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3333083/c5067c1a-6099-f6a1-65f6-83dd1b78d31d.png)

---
基本的なモデルの作りを見ることができました。

モデルについて今回触れられなかったものとして、重要な設定が2つがります。
* マテリアライゼーションの設定
* モデル間の依存関係の設定

これらは初期化時に作成されたサンプルモデルに含まれていたので、次の機会に見ていきたいと思います。