Quickstart for dbt and Snowflake試してみた

Quickstart for dbt and Snowflake試してみた

Clock Icon2025.07.10

かわばたです。

dbtLabsが提供しているガイドのQuickstart for dbt and Snowflakeについて試していきます。

関連ページは下記となります。
dbtLabsが提供しているガイド
https://docs.getdbt.com/guides/snowflake?step=1

事前準備

下記がはじめるにあたり必要な要素となります。

  • dbt Cloudのアカウント
  • Snowflakeのアカウント
    ※かわばたはdbtについてはEnterprise版,SnowflakeトライアルアカウントのEnterprise版で試しています。

1.はじめに

このセクションでは、今回実践するクイックスタートガイドでどのようなことを行うか説明がありました。詳細は下記になります。

  • 新しいSnowflakeワークシートの作成
  • サンプルデータをSnowflakeアカウントにロード
  • dbtをSnowflakeに接続
  • サンプルクエリをdbtプロジェクトのモデルに変換
  • dbtプロジェクトにソースを追加
  • モデルにテストを追加
  • モデルのドキュメント作成
  • ジョブの実行をスケジュール

2.新しいSnowflakeワークシートの作成

  1. トライアル版のSnowflakeアカウントにログインします。
    スクリーンショット 2025-07-07 141106
  2. SnowflakeUIで、Snowflakeロゴの下にある左隅の+ 作成をクリックするとドロップダウンが開きます。最初のオプションSQLワークシートを選択します。
    スクリーンショット 2025-07-07 141324

上記を行うと下記ページに遷移します。
スクリーンショット 2025-07-07 142354

3.データを読み込む

Snowflakeにデータを読み込み連携の準備を行います。

  1. 検証用に新しい仮想ウェアハウス、2つの新しいデータベース、2つの新しいスキーマを作成します。
    先ほど開いたSQLワークシートのエディタに下記SQLコマンドを入力し、実行します。
create warehouse transforming;
create database raw;
create database analytics;
create schema raw.jaffle_shop;
create schema raw.stripe;

実行すると下記のような形で、ウェアハウス・データベース・スキーマが作成されていることが分かります。
スクリーンショット 2025-07-07 144446
スクリーンショット 2025-07-07 144150

  1. 1で作成したrawデータベースに対して、関連するデータ(customer,orders,payment)をCOPYコマンドを用いてロードしていきます。
  • customerテーブルの作成
 create table raw.jaffle_shop.customers 
 ( id integer,
 first_name varchar,
 last_name varchar);

- COPYコマンドを実行してcustomerテーブルにデータをロード

```sql
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);

同様に、orders,paymentについても作成していきます。

  • ordersテーブルの作成
create table raw.jaffle_shop.orders
( id integer,
  user_id integer,
  order_date date,
  status varchar,
  _etl_loaded_at timestamp default current_timestamp);
  • COPYコマンドを実行してordersテーブルにデータをロード
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);
  • paymentテーブルの作成
create table raw.stripe.payment 
( id integer,
  orderid integer,
  paymentmethod varchar,
  status varchar,
  amount integer,
  created date,
  _batched_at timestamp default current_timestamp);
  • COPYコマンドを実行してordersテーブルにデータをロード
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);   

3.最後に作成したテーブルにデータがロードされているか確認します。

select * from raw.jaffle_shop.customers;
select * from raw.jaffle_shop.orders;
select * from raw.stripe.payment;

下記のようにデータが表示されていることが確認できました。

スクリーンショット 2025-07-07 151205

※このセクションで使用したSQLコマンドの公式ドキュメントを残します。
https://docs.snowflake.com/ja/sql-reference/sql/create-warehouse
https://docs.snowflake.com/ja/sql-reference/sql/create-database
https://docs.snowflake.com/ja/sql-reference/sql/create-schema
https://docs.snowflake.com/ja/sql-reference/sql/create-table
https://docs.snowflake.com/ja/sql-reference/sql/copy-into-table
https://docs.snowflake.com/ja/sql-reference/sql/select

4.dbtをSnowflakeに接続する

Snowflakeにdbtを接続する方法は主に2つあります。

  • Partner Connect
  • 手動でセットアップ
    今回は手動でセットアップしていきます。
  1. dbtで新しいプロジェクトを作成します。左側下部のアカウント名をクリックし、Account settingsを選択、Projectを開き右側上部の+New projectをクリックします。
    スクリーンショット 2025-07-07 172344

  2. 任意のプロジェクト名を記載し、Continueをクリックします。
    スクリーンショット 2025-07-07 172924

  3. 2を実行すると、下記画面に遷移するので、Connectionを設定します。
    2025-07-08_17h30_30

  4. プルダウンを開きAdd new connectionをクリックすると下記画面に遷移します。TypeをSnowflakeと設定、Connection nameは任意の名前で登録し、Settingsを設定したデータベース・ウェアハウス名に変更し保存します。
    2025-07-08_17h37_06
    アカウント名はSnowflakeのUIで確認します。SnowflakeのUIに戻り、左下のメニューからアカウント名をクリックし、アカウント識別子をコピーします。
    2025-07-07_17h58_58

  5. 4まで完了したら、再度Account settingsを選択、Projectを開き作成したProjectをクリックします。下記画面に遷移するので、Configure development environment and add a connectionをクリックします。
    2025-07-08_17h57_32

  6. するとConnectionのプルダウン内に、4で作成したConnection nameが選択できるのでクリックします。※かわばたはSnowflakeと登録したので、Snowflakeを選択しました。
    Username,PasswordにSnowflakeにサインインする際のUsername,Passwordを記載します。
    2025-07-08_18h14_25

入力後、Test Connectionをクリックし、下記のようにConnection test successfulと表示されれば接続できています。

スクリーンショット 2025-07-07 173736

  1. 6完了後、Setup a repositoryを設定する画面に遷移します。今回はManagedを選択し任意のRepository nameを記載します。
    スクリーンショット 2025-07-07 173929

Your project is ready!となりましたので、準備完了です。
2025-07-08_18h22_46

5.dbt管理リポジトリを設定

先ほどの4-7で設定できているのでskipします。

6.dbtプロジェクトを初期化して開発

  1. Studio IDEをクリックし起動させます。
  2. 左側のファイルツリーの上にあるInitialize your projectをクリックすると下記画面のようになります。
    2025-07-07_18h10_57
  3. Commit and syncをクリックして、最初のコミットを行います。
  4. ここまでの状況を踏まえた環境で初めてのdbtコマンド実行を試してみます。下記のように画面下部でdbtコマンドdbt runを入力し実行する事が可能です。
    2025-07-07_18h36_58

実行すると下記のような形で処理されました。
スクリーンショット 2025-07-07 185541

7.はじめてのモデル開発

実際にモデルの開発を行っていきます。
新しいブランチを作成するため、下記のようにCreate branchをクリックします。
2025-07-08_09h50_28
任意のブランチ名を記載しsubmitします。
2025-07-08_09h52_07

下記順序でクエリを記載したファイルを保存していきます。

  1. 左側ツリー下部にあるFile explorer配下のmodelsの三点リーダー(︙)をクリックし、Create fileでファイルを作成します。
    2025-07-08_09h54_59
  2. 1を行うと下記画面がポップアップするのでcustomers.sqlと記載し、Createをクリックします。
    2025-07-08_09h58_38
  3. 下記のようにmodelsの配下にcustomers.sqlとモデルが生成されました。
    2025-07-08_10h02_03
  4. customers.sqlをクリックしエディタに下記クエリを貼り付け保存します。
with customers as (

    select
        id as customer_id,
        first_name,
        last_name

    from raw.jaffle_shop.customers

),

orders as (

    select
        id as order_id,
        user_id as customer_id,
        order_date,
        status

    from raw.jaffle_shop.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
  1. dbt runと実行してみると、下記のように作成したcustomers.sqlモデルも実行されていることが分かります。
    2025-07-08_10h09_40

8.モデルのマテリアライズ方法を変更

dbtの最も強力な機能の一つは、設定値を変更するだけで、モデルがウェアハウス内でどのようにマテリアライズされるかを変更できることです。裏側でDDL(データ定義言語)を記述する代わりに、キーワードを変更するだけで、テーブルとビューを切り替えることができます。

デフォルトでは、すべてがビューとして作成されます。しかし、ディレクトリレベルでこの設定を上書きすることができ、そのディレクトリ内のすべてのモデルが異なるマテリアライゼーションで作成されるようになります。

実際に試していきます。

  1. dbt_project.ymlのファイルを編集します。
  2. プロジェクトのnameを下記のように更新します。
name: 'jaffle_shop'
  1. 設定ブロックを下記のように更新しテーブルとしてマテリアライズされるよう設定します。
models:
  jaffle_shop:
    +materialized: table
    example:
      +materialized: view

2025-07-08_10h22_47

実際にdbt runで実行してみると、ログにcreated sql table modelと表示され、テーブルとして更新されていることが分かりました。

2025-07-08_10h42_12

9.サンプルモデルの削除

モデルの作成ができるようになったため、デフォルトで用意されているモデルを削除していきます。
対象は 左側ツリー下部にあるFile explorer配下のmodels/example配下のファイルです。

下記のようにexampleフォルダのメニューからDeleteをクリックします。
2025-07-08_10h47_51

models配下を確認すると、exampleフォルダが削除されていることが確認できました。

10.他のモデルの上にモデルを構築する

既存のクエリでは、共通テーブル式(CTE)を使うことで、対応していました。SQLのベストプラクティスとして、「データをクリーンアップするロジック」と「データを変換するロジック」は分離すべきです。

下記イメージ

-- 1つのSQLファイル内での分離 (CTEを使用)
WITH source_data AS (
    SELECT * FROM raw_data
),

-- ① クリーンアップのロジック
cleaned_data AS (
    SELECT
        id AS order_id,
        user_id AS customer_id,
        amount
    FROM source_data
),

-- ② 変換のロジック
customer_orders AS (
    SELECT
        customer_id,
        COUNT(order_id) AS number_of_orders,
        SUM(amount) AS total_amount
    FROM cleaned_data
    GROUP BY 1
)

SELECT * FROM customer_orders

上記の①クリーンアップのロジックと②変換ロジックは分離することがベストプラクティスです。

各ロジックを別々のモデルに分離し、ref関数を使ってモデルの上に別のモデルを構築する(=モデルを連携させる)方法を試すことができます。

ref関数のドキュメントは下記になります。
https://docs.getdbt.com/reference/dbt-jinja-functions/ref

実際にやってみましょう。
modelsフォルダ配下に下記sqlファイルを2ファイル作成します。

  1. stg_customers.sql
select
    id as customer_id,
    first_name,
    last_name

from raw.jaffle_shop.customers

2025-07-08_11h13_13
2. stg_orders.sql

select
    id as order_id,
    user_id as customer_id,
    order_date,
    status

from raw.jaffle_shop.orders

2025-07-08_11h13_43

  1. 作成していたmodels/customers.sqlを下記のように更新します。
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

実際に実行してみると下記のようになりました。
2025-07-08_11h18_23
依存関係としては下記のようになっています。
2025-07-08_11h20_06

11.モデルに対してテストを追加

dbtではプロジェクトにテストを実装することで、作成したモデルが意図通りに機能しているかを確認することができます。
modelsフォルダ配下にschema.ymlというYAMLファイルを作成し、下記コードを記載し保存してください。

version: 2

models:
  - name: customers
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null

  - name: stg_customers
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null

  - name: stg_orders
    columns:
      - name: order_id
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
      - name: customer_id
        tests:
          - not_null
          - relationships:
              to: ref('stg_customers')
              field: customer_id

下記のように保存します。

2025-07-08_11h30_49

dbt testを実行し、下記の通りすべてのテストが成功したことを確認しました。
2025-07-08_11h33_53
dbtはYAMLファイルを反復処理し、各テストにクエリを作成します。各クエリは、テストに失敗したレコードの数を返します。この数が 0 の場合、テストは成功です。

12.モデルに対してドキュメントを生成

プロジェクトにドキュメントを追加することで、モデルについて詳細に記述し、その情報をチームで共有することができます。ここでは、プロジェクトにいくつかの基本的なドキュメントを追加していきます。

先程テスト実行時に作成したschema.ymlの内容を以下の形に修正します。各種要素にdescriptionの項目が追加された形です。

version: 2

models:
  - name: customers
    description: One record per customer
    columns:
      - name: customer_id
        description: Primary key
        tests:
          - unique
          - not_null
      - name: first_order_date
        description: NULL when a customer has not yet placed an order.

  - name: stg_customers
    description: This model cleans up customer data
    columns:
      - name: customer_id
        description: Primary key
        tests:
          - unique
          - not_null

  - name: stg_orders
    description: This model cleans up order data
    columns:
      - name: order_id
        description: Primary key
        tests:
          - unique
          - not_null
      - name: status
        tests:
          - accepted_values:
              values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
      - name: customer_id
        tests:
          - not_null
          - relationships:
              to: ref('stg_customers')
              field: customer_id

2025-07-08_11h38_42

dbt docs generateを実行すると、ドキュメントが生成されます。
2025-07-08_11h40_33

下記赤枠部分をクリックします。
2025-07-08_11h41_26

作成されたドキュメント画面に遷移し、下記のように確認することができます。
2025-07-08_11h43_35

13.変更した内容をコミットする

ここまで作業した内容をコミットしていきます。

Commit and syncをクリックします。
2025-07-08_11h58_25

コミットメッセージを入力して、Submitクリックします。

2025-07-08_12h00_39

Merge this branch to mainをクリックで変更をメインブランチにマージします。
2025-07-08_12h48_42

14.dbtのデプロイ

最後のセクションとなりました。
dbtのスケジューラを使用して、本番環境ジョブを確実にデプロイし、プロセスに可観測性を組み込みます。

この部分が公式で書かれている部分と差異があり、下記のように対応しました。

Orchestration配下のEnvironmentsをクリックします。
2025-07-08_14h54_14

Create Environmentをクリックすると下記画面に遷移するので、任意のEnvironment nameを設定します。
ConnectionはSnowflakeを選択し、Connection settingsは最初に設定したものを記載します。
DatabaseはANALYTICS,WarehouseはTRANSFORMINGと記載します。
2025-07-08_15h01_59

保存すると下記画面のようにPROD環境が作成されます。
2025-07-08_15h20_04
Create jobをクリックし、配下のDeploy jobを選択します。
2025-07-08_15h21_14
すると、下記の画面に遷移します。任意のJob Nameを設定し保存します。
2025-07-08_15h24_06

これでジョブの実行準備ができたので、右側上部にある`Run Now'をクリックします。
2025-07-08_15h27_00

実行すると、ジョブの実行状況を下記のように確認できます。
2025-07-08_15h28_06

実行が完了し、Snowflake側のデータベースANALYTICSを確認すると下記のように反映されていました。

2025-07-08_15h39_56

最後に

いかがでしたでしょうか。dbtとSnowflakeを接続し、デプロイまで体験できるこのガイド(チュートリアル)を通して、私自身も実際に触ることでイメージが格段に上がりました。
弊社過去エントリもありますが、dbtのバージョンが上がったからか変更されている部分もありましたので、
2025年版ということで参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.