1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-12-06

はじめに

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

アカウント作成

公式ウェブサイトの画面右上にある「Try dbt Cloud」を選択

image.png

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

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

image.png

接続方法を選択

Connectionより「Snowflake」を選択

image.png

Snowflake側の事前準備

トライアルアカウントの作成
 →SnowflakeのUIに移動して初期設定を行います。
・必要な資材の準備
 →クイックスタートを参考にサンプルデータの取り込みまで行います。
 データベースは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

別タブで開いているプロジェクトのセットアップページに移動

Connectionには先ほど作成したSnowflakeのコネクションを選択
Snowflakeのログイン情報を入力

image.png

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

Snowflakeの接続テスト

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

image.png

リポジトリ設定

検証などの用途であれば「managed」で十分です。

image.png

初期設定は完了

image.png

モデル作成

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

image.png

[補足]クイックスタート後の状態を回復したい方向け

クイックスタート後の状態を用意したい場合に使えそうなので記録。
※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

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

デプロイ用にPRD環境を作成

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

image.png

ジョブ作成

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

image.png

image.png

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

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

image.png
詳細は別の記事に載せようと思います。

ジョブ実行

ジョブを選択し右上の「Run now」から実行
image.png

実行結果は画面下側に記載。
image.png

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

image.png

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

最後に

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?