dbtを使ってみた(BigQueryのクイックスタート)

この記事は前半で dbt のざっくり紹介、後半で公式の「dbt と BigQuery のクイックスタート」を手順通りに試してみた流れをご紹介します。


dbtってなに?(ざっくり)

dbt は、データの変換を SQL中心 で進めながら、開発の流れを整えやすくしてくれるツールです。

dbt を利用するメリットは以下の通りです。

  • モデルをモジュール化して再利用しやすい
  • ソフトウェア開発の定番(Git、レビュー、CI/CDなど)を分析開発に持ち込める
  • データ品質テストを追加しやすい
  • ドキュメントが作りやすく、共有もしやすい

dbt platform(dbt Cloud)と dbt Core の違い

dbt には大きく2つの使い方があります。

  • dbt platform(旧 dbt Cloud)
    • ブラウザのUIで開発・実行・スケジュールなどをまとめて扱える
  • dbt Core
    • ローカル環境でCLI中心に運用する(OSS)

今回のクイックスタートは、基本的に dbt platform で試しました。


無料でも試せる?

結論、無料でも利用可能です。

しかし、1つのプロジェクトしか扱えないなど制限はありますが、学習目的なら問題ありません。

  • Developer:無料版
    • まず個人で触って雰囲気をつかむ枠
  • Starter:ユーザーあたり月額100ドル
    • 小さくチーム運用を始める枠
  • Enterprise:カスタム価格設定
    • 分析とAIのユースケースをサポートする枠
  • Enterprise+:カスタム価格設定
    • セキュリティと展開を最大限に制御する枠

「dbt と BigQuery のクイックスタート」をやってみた

dbt と BigQuery のクイックスタート

クイックスタートガイドは、以下の流れで説明してくれます。

  • Google Cloud Platform (GCP) プロジェクトを作成
  • 公開データセット内のサンプルデータにアクセス
  • dbt をBigQuery に接続
  • サンプルクエリをdbtプロジェクトのモデルに変換
  • モデルにテストを追加
  • モデルを文書化
  • ジョブの実行をスケジュール

ガイドの内容を全て記載すると長くなってしまうので、メインとなる部分をピックアップしてご紹介します。

dbt と BigQuery の接続

dbtとBigQueryの接続では、GCPで発行したサービスアカウントを利用して接続します。

dbtの接続設定にて、JSONファイルをアップロードするだけなのでサクッといけます。

注意:今回作成するサービスアカウントには強い権限を付与します。クイックスタートではGitでコミットの手順があるので、コミットしないように管理には気をつけましょう!

dbt から BigQuery のテーブルを作成

dbt からコマンドを叩くことでBigQueryにテーブルを作成することができます。
画面下のコンソールからコマンドを叩くことができます。(全然見つからなくて、ここでつまづきました笑)

dbt run

コマンドを実行して以下のようなエラーが起きる場合があります。

System logs からエラーメッセージを見てみると、以下のようなメッセージが出ていました。

Compilation Error in model customers (models/customers.sql) Trying to create view `[プロジェクト名]`.`[データセット名]`.`customers`, but it currently exists as a table. Either drop `[プロジェクト名]`.`[データセット名]`.`customers` manually, or run dbt with `–full-refresh` and dbt will drop it for you.

customersというテーブルはすでにあるよ、手動で削除するか、「–full-refresh」というオプションをつけて実行してね、と書いてあります。
言われた通りに、オプションコマンドを加えて実行すると成功しました。

dbt run --full-refresh

まずは System logs を確認して、表示された指示に従ってみてください。

他のモデルを参照してモデルを作成する

stg_customersというモデルを作成します。

models/stg_customers.sql
select
    id as customer_id,
    first_name,
    last_name

from `dbt-tutorial`.jaffle_shop.customers

上記で作成したモデルを {{ ref(‘model_name’) }} という記述で参照することができます。

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

これで models/stg_customers.sql と同じ結果が得られます。
このように、既存のモデルを参照することで “ロジックを再利用” が可能となります。
複数のモデルを参照、結合することで新しいモデルを作成していきます。

モデルのテスト

schema.yml を作ってモデルのテストを追加することができます。
例として、stg_customers(モデル) の customer_id(カラム) が以下の条件を満たしているかをテストします。

  • 一意であること:unique
  • nullを許容しないこと:not_null
models/schema.yml
version: 2

models:
  - name: stg_customers
    columns:
      - name: customer_id
        data_tests:
          - unique
          - not_null

以下のコマンドを実行するとテストを実行できます。

dbt test

このように、最低限の品質チェックを組み込むことができます。

ソースの宣言

ソースをdbtに宣言しておくことで、参照元のテーブルの説明が記載できたり、モデルで行ったテストを実施したりすることができます。

models/sources.yml
sources:
    - name: jaffle_shop
      description: This is a replica of the Postgres database used by our app
      database: dbt-tutorial
      schema: jaffle_shop
      tables:
          - name: customers
            description: One record per customer.
          - name: orders
            description: One record per order. Includes cancelled and deleted orders.

dbtに宣言したソースは、以下のように呼び出すことができます。

select
    id as customer_id,
    first_name,
    last_name

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

モデルの文書化(dbt Docs)

dbt Docs を使うと、モデルの説明や依存関係を可視化することができます。
モデルの説明は schema.yml に追加します。

models/schema.yml
version: 2

models:
  - name: stg_customers
    description: This model cleans up customer data # -> 追記
    columns:
      - name: customer_id
        description: Primary key  # -> 追記
        data_tests:
          - unique
          - not_null

カタログページから対象のテーブルを選択すると、テーブルの説明やCode、Columnsなど、YAMLファイルで記述した情報を確認することができます。

依存関係は、カタログにてプロジェクト選択し、右上に出てくる「View lineage」をクリックすると確認することができます。

「どのモデルがどれに依存してる?」が追いやすくなるので、モデルが増えてきたときに効いてきそうです。

ジョブを作る

最後に、デプロイ用の環境を用意してジョブを作り、定期実行できるようにします。

デプロイ環境の設定にて「Dataset」に入力した名前が、BigQueryのプロジェクトID配下に作成されるデータセット名になります。

実際にジョブを実行させると、BigQueryにテーブルが作成されます。
クイックスタートガイド通りにやると、このような状態になります。


まとめ

今回はdbt公式が出している「dbt と BigQuery のクイックスタート」をやってみました。

依存関係が可視化できたり、テストができたりと便利な機能が多いツールなのがdbtです。
まだ理解できてないところも多いので、別の記事で深堀していきたいと思います!

では、お楽しみに〜