🔰QuickStart🔰dbtでSnowflakeのデータを"T"してみる

# はじめに
公式ドキュメントである**Quickstart for dbt Cloud and Snowflake**をやってみたdbt初心者です。
ドキュメントに沿って進めていくうちに、先に知っておけばよかったな～と思った事などをメモしています。
dbt初心者の助けになるはず！

https://docs.getdbt.com/guides/snowflake?step=1

# クイックスタートで出来ること
ドキュメント通りですが以下のようにSnowflakeとの接続からdbtのモデル作成、ジョブ実行まで一連の流れを体験できます。

>・新しいSnowflakeワークシートを作成します。
>・サンプルデータをSnowflakeアカウントにロードします。 
>・dbt CloudをSnowflakeに接続します。
>・サンプルクエリをdbtプロジェクトのモデルにします。
>・dbtプロジェクトにソースを追加します。
>・モデルにテストを追加します。 
>・モデルを文書化します。
>・ジョブの実行をスケジュールします。


# 1.事前準備
**・Snowflakeトライアルアカウント作成**

https://signup.snowflake.com/?_l=ja

Snowflake無料トライアル環境の期限は30日です。

**・dbtアカウント作成**

https://www.getdbt.com/dbt-cloud-signup-2

今回はdbt Cloudを使用します。プランは「Developer」を選択しました。
「Developer」プランでアカウントを作成後14日間は「Team」プランのトライアル環境になるようです。

:::note warn
**「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:``

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/8a4863b7-e3fc-6528-fc63-844ce88a78d0.png)


**サンプルデータをロードする**
S3に格納されているサンプルデータをロードします。ロードにはCOPYコマンドを使用しています。実行後はきちんとデータが入っているか確認しておくことをオススメします。

・顧客情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/0c978f82-9549-9151-6d0a-129623e9ec8e.png)

・注文情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/dba30f5c-16c8-828d-fe7c-e61ff47a91c4.png)

・支払情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/8ec2c415-dff0-826c-c026-8b6236ac60fb.png)

# 4.Snowflakeとdbtを接続する
接続する方法は2種類あります。
今回はdbt Cloudから手動で接続する **Connect manually**にしました。

**アカウント識別子について**
　鎖マークを選択しアカウントURLをコピー以下``xxx``の部分です
　https://``XXXXXXXX``.snowflakecomputing.com
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/369385f2-2ac0-7f40-757f-9cca8e6d8dc9.png)

ほか認証情報を入力し完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/c8bb8547-9718-4404-2f52-803282edb9ce.png)

# 5.dbtCloudのリポジトリの設定
ドキュメントの通りです。ここまでくれば準備は完了です！:tada:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/fd0eeada-5796-b861-9bfb-73822498cf3f.png)

# 6.dbtで開発をはじめよう
:package:**はじめに知っておくといいこと**

　・モデル=SQLファイルのこと
　・開発ページは「Develop」
　・モデル（ファイル）の名前には拡張子までつける (yml,sqlなど拡張子で判断）
　・実行は``dbt run``
　・指定したモデルだけ実行したい場合は``dbt run --select モデル名.sql``
 　・SQLのコードの文末に「;」を付けない

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/63ad33a5-3e86-42a5-5bec-dd5e3268284e.png)

# 7.はじめてのモデル作成
**ブランチ作成**
バージョン管理のためにブランチをします。ブランチ名は``add-customers-model``のように、これからどんな対応を入れるのかを記載します。
対応をひと言で説明するのが難しい場合や、案件ではjiraのチケット番号と紐づける等の工夫をするみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/3036eea8-1b0d-742c-20a4-9a2248c6f612.png)

**モデル作成時に助かる便利ポイント:bulb:**

プレビュー機能があります！モデル内の一部を選択し実行することでデータを確認できます。当たり前かもしれませんが、SnowflakeのGUIを使用せずdbtだけでデータマート開発が出来るなんて、感動 :sob:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/d81d3551-02c1-a8c8-8230-066d67fadefc.png)


# 8.モデルのmaterializedを変更
### materializedについて
モデルで何を作るのか決めることが出来ます。
詳細については別の記事を投稿しようと思うのでここでは紹介のみとします。

**種類**
　・table
　・view
　・incremental
　・ephemeral　
　・materialized view
 
 https://docs.getdbt.com/docs/build/materializations
 
**設定方法**
materializedの設定方法は2種類あります。
①ymlファイルで一括設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/b019bba7-336e-6c67-04eb-88fffc93fa01.png)

②モデルごとに指定
モデルによってmaterializedを変える場合はこちらが良さそうですね:star2:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/967a1361-d687-67f1-16c4-d9856d4662d5.png)


``dbt run``をしてみるとSnowflake上に成果物が出来ているはずです！


**9.exampleモデルを削除します。ドキュメント通りなので割愛します。**

# 10 モデルに依存関係を持たせよう

``stg_cusomers``と``stg_orders``を参照した``cusomers``モデルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/894ec622-1de6-41e9-f449-cf67f109e124.png)

モデルを参照する場合は``ref()``を使用します。``cusomers``モデルは以下のようになります。

```customers.sql
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('スキーマ名', 'テーブル名') }}``

**便利ポイント:bulb:**
リネージュ機能を確認すると依存関係も一目で確認できます:raised_hands:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/c4825338-ed36-a3c4-33fb-729bfead431f.png)

これによりモデルがSnowlfakeのどのテーブルから作られているのかが分かるようになります:yum: 便利！

# 実行結果をSnowflakeでも確認してみる
Snowflakeでテーブル``customers``が作成されていることを確認できました:clap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/0085217f-133d-8b27-1e29-eea2eadfb23a.png)

# 12.テスト
``model``ディレクトリ配下に``schema.yml``ファイルを作成しテストを行います。
各テーブルのカラムに対してテスト観点を記載します。

```.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

```

:point_up:ここまでドキュメント通りに進めていたはずがテストでエラーになりました
（わたしのミスです:girl_tone5:）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/612b1245-82ed-d274-eed3-e8169c5458c4.png)

エラーメッセージを頼りにSnowflakeを見ると``my_first_dbt_model``の``id``がnullになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/2998c85e-7931-89d9-9ef9-cf4c1435a344.png)

前項9で削除したはずの``example``モデルが削除できていなかった事が原因でした。解決:fist:
ということで``model/``にある全てのモデルがテスト対象になります。

**再テスト**
ymlファイルで定義したテスト観点ごとに確認をしていることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/22b4b6f3-b849-c2a0-addc-89511c584d30.png)


**13,14はドキュメントの通りに進めました。**

# 15.dbtをデプロイする（ジョブを作ろう）
デプロイ環境を作成したうえでジョブを作成し実行します。

以下がジョブを実行した結果です！成功！:angel_tone2:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/7238a989-3800-be9f-4308-f9ff3d522896.png)


# 最後に所感
dbtは"T"に集中できる環境だと感じました。
データマート開発時に感じるちょっとした嫌なことが解消されているような気がします:dancers:

はじめはdbtって何が出来るの？何がすごいの？と思っていましたが、触っていくうちにdbtの便利さに気付き感動していました:sob: 本当に奥が深くまだまだ分からない事ばかりです。

dbtが私たちの代わりにやってくれたことを実際にSnowflakeではどのようなクエリとして実行されていたのか等、検証した内容を少しずつ投稿していこうと思います。