dbt Cloudのはじめ方~Snowflake接続からジョブ実行まで~

# はじめに
dbt Cloudを試してみたいと思われた方向けの記事です。
今すぐdbtを始められるよう必要最低限の準備についてまとめました。
この記事を読めばSnowflakeのデータを使ってジョブ実行まで実現できます。

## アカウント作成
[公式ウェブサイト](https://www.getdbt.com/)の画面右上にある「Try dbt Cloud」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/ac4049ff-73b6-c466-57cb-d0f2c3ff465d.png)

## 招待メールを確認しログイン

プロジェクトのセットアップ画面に映るのでコネクションの設定から始める

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/490c616c-2de3-f6e4-9cbf-10f0c9c8b519.png)


## 接続方法を選択
Connectionより「Snowflake」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/4778a9cf-2979-e56b-c2ec-e9a96e3704cd.png)

## Snowflake側の事前準備
・[トライアルアカウント](https://signup.snowflake.com/?_l=ja)の作成
　→SnowflakeのUIに移動して初期設定を行います。
・必要な資材の準備
　→[クイックスタート](https://docs.getdbt.com/guides/snowflake?step=3)を参考にサンプルデータの取り込みまで行います。
  　データベースはSnowflakeの設計思想に基づきRAW/OPEN/MARTの3つを作成します。
  　RAWは生データ、OPENは使いやすいように整形したデータ、MARTはBI/MLなど特定のアウトプットに特化したデータを格納します。dbtのモデルではOPENとMARTを作成します。

```.sql
--初期準備
create warehouse transforming;
create database raw;
create database open;
create database mart;
create schema raw.jaffle_shop;
create schema raw.stripe;

--サンプルデータ用テーブル作成、データ取り込み
create table raw.jaffle_shop.customers 
( id integer,
  first_name varchar,
  last_name varchar
);

copy into raw.jaffle_shop.customers (id, first_name, last_name)
from 's3://dbt-tutorial-public/jaffle_shop_customers.csv'
file_format = (
    type = 'CSV'
    field_delimiter = ','
    skip_header = 1
    ); 

create table raw.jaffle_shop.orders
( id integer,
  user_id integer,
  order_date date,
  status varchar,
  _etl_loaded_at timestamp default current_timestamp
);

copy into raw.jaffle_shop.orders (id, user_id, order_date, status)
from 's3://dbt-tutorial-public/jaffle_shop_orders.csv'
file_format = (
    type = 'CSV'
    field_delimiter = ','
    skip_header = 1
    );

create table raw.stripe.payment 
( id integer,
  orderid integer,
  paymentmethod varchar,
  status varchar,
  amount integer,
  created date,
  _batched_at timestamp default current_timestamp
);

copy into raw.stripe.payment (id, orderid, paymentmethod, status, amount, created)
from 's3://dbt-tutorial-public/stripe_payments.csv'
file_format = (
    type = 'CSV'
    field_delimiter = ','
    skip_header = 1
    );

--取り込み確認
select * from raw.jaffle_shop.customers;
select * from raw.jaffle_shop.orders;
select * from raw.stripe.payment;

--以下は必要に応じて実行してください
--アカウントのタイムゾーンを変更する
alter account set timezone = 'Asia/Tokyo';
```

## dbtに戻りコネクションの設定を続ける

アカウント識別子について
　鎖マークを選択しアカウントURLをコピーし```XXXXXXXX```の部分を切り取り。
　https://```XXXXXXXX```.snowflakecomputing.com
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/34707333-dbb4-2b8b-b718-2db28fc8dc39.png)

## 別タブで開いているプロジェクトのセットアップページに移動
Connectionには先ほど作成したSnowflakeのコネクションを選択
Snowflakeのログイン情報を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/72302fd4-0e40-c6f5-cc53-54e74cf4da0d.png)

指定したスキーマにdbtモデルが作成されます。
デフォルトでは「dbt_名前の頭文字と苗字」が付けられます。

## Snowflakeの接続テスト
設定後、接続テストまでやっておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/9c78a4a3-c08d-4dae-25f6-9cd03e50f1cf.png)

## リポジトリ設定
検証などの用途であれば「managed」で十分です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/3cc96d91-fd04-fc25-6846-ac0e862d340d.png)

## 初期設定は完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/e60e648b-2eb4-89d5-c11f-62211dec2994.png)

## モデル作成
「Develop」から開発者画面に遷移。「Click here to initialize your project」を選択します。
「models」フォルダ配下にSQLモデルや設定ファイルを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/cac3b5a2-45aa-30c6-41c8-242fa6ecd2de.png)

## [補足]クイックスタート後の状態を回復したい方向け
※[クイックスタート](https://docs.getdbt.com/guides/snowflake?step=3)後の状態を用意したい場合に使えそうなので記録。
※materializedやfreshnessについて追記あり
※models配下のexamleフォルダは削除する

```sources.yml
version: 2

sources:
    - name: jaffle_shop
      description: This is a replica of the Postgres database used by our app
      database: raw
      schema: jaffle_shop
      tables:
          - name: customers
            description: One record per customer.
          - name: orders
            loaded_at_field: _etl_loaded_at
            freshness: 
              error_after: {count: 5, period: minute}
            description: One record per order. Includes cancelled and deleted orders.
```

```stg_customer.sql
{{
    config(
        materialized='table'
    )
}}
select
    id as customer_id,
    first_name,
    last_name

from {{ source('jaffle_shop', 'customers') }}
```

```stg_orders.sql
{{
    config(
        materialized='table'
    )
}}
select
    id as order_id,
    user_id as customer_id,
    order_date,
    status

from {{ source('jaffle_shop', 'orders') }}
```
```customers.sql
{{
    config(
        materialized='table'
    )
}}

with customers as (

    select * from {{ ref('stg_customers') }}

),

orders as (

    select * from {{ ref('stg_orders') }}

),

customer_orders as (

    select
        customer_id,

        min(order_date) as first_order_date,
        max(order_date) as most_recent_order_date,
        count(order_id) as number_of_orders

    from orders

    group by 1

),

final as (

    select
        customers.customer_id,
        customers.first_name,
        customers.last_name,
        customer_orders.first_order_date,
        customer_orders.most_recent_order_date,
        coalesce(customer_orders.number_of_orders, 0) as number_of_orders

    from customers

    left join customer_orders using (customer_id)

)

select * from final
```

``dbt build``後の結果は以下。リネージュも確認できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/3b4202b1-588e-27ff-151b-ab1513c73d93.png)

作業をはじめるときはブランチを作成、作業が完了したらmainブランチへマージをしてください。
左上が「Create bracnch」の状態になっていることを確認し次へ進む。

## デプロイ用にPRD環境を作成
画面左上部「Deploy」＞「Environments」より環境を作成。
作成したSnowflakeコネクションを設定しログイン情報を入力。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/876ac049-5027-6b8a-88a2-1289883af56d.png)

## ジョブ作成
環境作成が完了しPRDページへ遷移。画面右下「Create job」からジョブを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/eefccc8f-526f-256a-7bd3-0967fb3428c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/79d57c6b-882e-c926-3055-78aaaf8320e7.png)

実行設定について以下のようにコマンドをカスタムすることが出来ます。
・``dbt build --select +customers.sql``
customers.sqlモデルに紐づく先行モデルも同時に実行します。

dbt buildで指定しているモデルはcustomers.sqlですが、「＋」を付けることで先行タスクであるstg_ordersとstg_customersも実行の対象になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/6918c4fa-0a4f-4e1f-04d3-5af92ff3623c.png)
詳細は別の記事に載せようと思います。

## ジョブ実行
ジョブを選択し右上の「Run now」から実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/ee9ce39f-4f5c-f2e3-f569-52c6a3b14076.png)

実行結果は画面下側に記載。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/552a5593-1e96-2e5e-15a9-68cc810722c8.png)

詳細を確認する。ジョブが成功していることが分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3586761/dcd3e66e-ade2-1f37-5c48-c0356dea51d7.png)

ジョブはAPIトリガーで呼び出すことも可能です。こちらも別途記事を書きます。

## 最後に
未来の自分用に備忘録として残しました。dbt開発の一連の流れは抑えられたと思います。
この記事があればいつでもdbtで検証できる状態になるはず！参考になれば幸いです。