この記事は前半で 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 のクイックスタート」をやってみた
クイックスタートガイドは、以下の流れで説明してくれます。
- 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というモデルを作成します。
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
version: 2
models:
- name: stg_customers
columns:
- name: customer_id
data_tests:
- unique
- not_null以下のコマンドを実行するとテストを実行できます。
dbt testこのように、最低限の品質チェックを組み込むことができます。
ソースの宣言
ソースをdbtに宣言しておくことで、参照元のテーブルの説明が記載できたり、モデルで行ったテストを実施したりすることができます。
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 に追加します。
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です。
まだ理解できてないところも多いので、別の記事で深堀していきたいと思います!
では、お楽しみに〜