【dbt Docs】Introduction - What is dbt?
概要
dbtを導入するにあたって、
所々に、注釈とか入れてます。
dbtとはなんですか?
dbt = data build tool (データ構築ツール)
分析エンジニアは、Select句を記述するだけで、データウェアハウス内のデータ変換ができる
dbt は ELT(Extract、Load、Transfer)
での T
を担う
※なので、データがロード済の場合に大きな力を発揮する
これまで、SQLでのDWHの構築は、手動・・・でやる場合が多かったと思っていますが、dbtを使うとソフトウェア開発のように作業することができ、IaC(Infra as Code)のように、状態を保持し、属人化を廃することができる
dbtを使用するにはどうすればいい?
dbt Projects
dbtのプロジェクトには、ディレクトリ
と .sql
ファイル。設定などを記載する yml
ファイルが必要。
モデル | モデルは単一の.sql ファイルです。select 各モデルには、生データを分析の準備ができているデータセットに変換する、または多くの場合、そのような変換の中間ステップである単一のステートメントが含まれています。 |
プロジェクトファイル |
dbt_project.yml dbtプロジェクトを構成および定義するファイル。 |
※プロジェクトには通常、テスト、スナップショット、シードファイルなど、他の多くのリソースも含まれている
Database Connections
dbtはデータウェアハウスに接続して、データ変換クエリを実行します。dbtを使用するためには、ソースデータが取り込まれ済みのデータウェアハウスが必要
※dbtは、基本、データの取り込みは役割にはない
現在(2022年3月時点)では、 dbtLabsがサポートしているものは
- Snowflake
- BigQuery
- Redshift
- Postgres
- Apache Spark
- Presto(部分的なサポート) ※もしかして、Treasure Dataもできなくはない?
への接続がサポートされている。
この他にも、コミュニティーでサポートされているアダプターが多数ある。https://docs.getdbt.com/docs/available-adapters
ベンダー対応は
- Databricks
- Firebolt
- Materialize
- Pocketset
- SingleStore
- Starburst & Trino
- Teradata
コミュニティー対応は
- SQL Server & Azure SQL
- Azure Synapse
- Exasol Analytics
- Oracle Database
- Dremio
- ClickHouse
- Athena
- Vertica
dbt Commands
dbt Commandは、データベースに対してSQLをコンパイルして実行するdbtを実行するための命令
例に上げると dbt run
- プロジェクト内のモデルを実行する順序を決定(DAG的?)
- モデルの具体化に従って、モデルに必要なDDL(データ定義語、CREATEとか)を生成する
- プロファイルで定義された
target
で指定された資格情報を使用して、データウェアハウスに対してコンパイルされたクエリを実行します。これらのクエリを実行すると、データウェアハウスのターゲットスキーマにリレーションが作成されます。これらの関係には、分析の準備ができた変換済みデータが含まれています。
コマンドのリストは、こちら https://docs.getdbt.com/reference/dbt-commands
2022年3月時点で利用可能なコマンド
コマンド | CLIのみ | 説明 | 注釈 |
---|---|---|---|
build | 選択したすべてのリソース(モデル、シード、スナップショット、テスト)をビルドしてテストします | ||
clean | ✓ | dbtプロジェクトに存在するアーティファクトを削除します | アーティファクト? |
compile | プロジェクト内のモデルをコンパイルします(ただし、実行しません) | ||
debug | ✓ | dbt接続とプロジェクトをデバッグします | |
deps | プロジェクトの依存関係をダウンロードします | ??? | |
docs | プロジェクトのドキュメントを生成します | リネージュとかカラム定義とか | |
init | ✓ | 新しいdbtプロジェクトを初期化します | |
list | ✓ | dbtプロジェクトで定義されたリソースを一覧表示します | |
parse | ✓ | プロジェクトを解析し、詳細なタイミング情報を書き込みます | ? |
run | プロジェクトでモデルを実行します | ||
seed | CSVファイルをデータベースにロードします | kwsk | |
snapshot | ロジェクトで定義された「スナップショット」ジョブを実行します | ? | |
source | ソースデータを操作するためのツールを提供します(ソースが「新鮮」であることの検証を含む) | kwsk | |
test | プロジェクトで定義されたテストを実行します | unique テストとか | |
rpc | ✓ | クライアントがクエリを送信できるRPCサーバーを実行します | ? |
run-operation | データベースに対して任意のメンテナンスSQLを実行します |
※必要なコマンドについては追加で調べる
What does the workflow for using dbt look like?
dbtを操作するには、主に2つの方法があります。dbtCloudでWebベースの統合開発環境(IDE)を使用する方法と、コマンドラインインターフェイス(CLI)を使用する方法です。
Developing in dbt Cloud
Jobを動かせたりする。
Developing locally with the Command Line Interface (CLI)
dbt Cloudの前にあった方法。
使う手順としては
- dbtCLIをインストール( MacOSなら、homebrewを使った方法、pip、Dockerを使った方法、sourceから)
- データウェアハウスに接続するための設定を行う https://docs.getdbt.com/dbt-cli/configure-your-profile ※後で読む
- エディタでdbtプロジェクトを編集、ビルドする
- terminalなどでコマンドを実行する
dbt run
など
What makes dbt so powerful?
dbtがこれほど強力な理由は何?
dbtユーザーとしての主な焦点は、コアビジネスロジックを反映するモデルの記述(つまり、クエリの選択)です。
- テーブルやビューを作成したり
- モデルの実行順序を定義したり
するための定型コードを記述する必要はありません。
代わりに、dbtは、これらのモデルをウェアハウス内のオブジェクトに変換する処理を行います。
dbtは、ボイラープレートコードを処理して、クエリをリレーションとして具体化します。
作成するモデルごとに、マテリア ライゼーションを簡単に構成できます。
ボイラープレートコード: ボイラープレートコード (英: boilerplate code、または単にボイラープレート) は、コンピュータプログラミングでは、殆ど、または全く変化することなく、複数の場所で繰り返される定型コードのセクションのこと。
マテリアライゼーションは、選択クエリのビルド戦略を表します。マテリアライゼーションの背後にあるコードは、選択クエリをステートメントでラップして新しいリレーションを作成する、または既存のリレーションを更新する、堅牢な定型SQLです。
dbtには、次の組み込みのマテリアライゼーションが付属しています。
Materialize | |
---|---|
veiw ( default) | モデルはデータベース内のビューとして構築されます。 |
table | モデルはデータベースにテーブルとして作成されます。 |
ephemeral | モデルはデータベースに直接組み込まれていませんが、代わりに共通のテーブル式として依存モデルに取り込まれます。 |
incremental | モデルは最初はテーブルとして作成され、その後の実行で、dbtは新しい行を挿入し、テーブル内の変更された行を更新します。 |
(注釈)
必要に応じて、カスタムしたマテリアゼーションを作成することもできるそうだ。
ただ、 ephemeral
の使い方がいまいち思い浮かばない・・・・・WITH句相当、SnowflakeだとTemporaryテーブルと考えていいのか?
dbtは、モデルの実行順序を決定します
多くの場合、データを変換するときは、段階的なアプローチで変換するのが理にかなっています。dbtは、ref関数を介して段階的に変換を実装するメカニズムを提供します。
ウェアハウス内の既存のテーブルとビューから選択するのではなく、次のように別のモデルから選択できます。
select
orders.id,
orders.status,
sum(case when payments.payment_method = 'bank_transfer' then payments.amount else 0 end) as bank_transfer_amount,
sum(case when payments.payment_method = 'credit_card' then payments.amount else 0 end) as credit_card_amount,
sum(case when payments.payment_method = 'gift_card' then payments.amount else 0 end) as gift_card_amount,
sum(amount) as total_amount
from {{ ref('base_orders') }} as orders
left join {{ ref('base_payments') }} as payments on payments.order_id = orders.id
{{ ref }} がdbtの関数で、モデルの実行順序が決定できます。
上のモデルだと下記のようになる
dbtは、モデル間の相互依存性に基づいて有向非巡回グラフ(DAG)を構築します。グラフの各ノードはモデルを表し、ノード間のエッジは関数によって定義され ref ます。関数で指定されたモデル ref は、現在のモデルの先行として認識されます。モデル。
dbtが実行されると、モデルはDAGで指定された順序で実行されます。モデルの実行順序を明示的に定義する必要はありません。段階的変換でモデルを構築すると、単一の変換(たとえば、列の名前変更)を多数のダウンストリームモデルの先行モデルとして共有できるため、SQLを繰り返す必要も少なくなります。
(注釈)
※refを使って、依存関係が得られるので、モデル順序の実行を意識する必要がなくなるのは大きな利点
What else can dbt do?
dbtは他に何ができますか?
コードコンパイラ
Jinja (軽量テンプレート言語)が使える。 SQLにはない、ifやforループなどが使える!また、macrosを作って再利用もできる。
ドキュメント
dbtは、dbtモデルのドキュメントを作成、バージョン管理、および共有するためのメカニズムを提供します。モデルおよびフィールドごとに、説明(プレーンテキストまたはマークダウン)を記述できます。
これらの説明は、追加の暗黙的な情報(たとえば、モデルの系統、またはフィールドデータ型と適用されたテスト)とともに、Webサイトとして生成し、より広いチームと共有して、dbtと対話するすべての人に簡単に参照できるデータブックを提供できます。モデル。
テスト
基礎となるデータは頻繁に変更されるため、SQLのテストは難しい場合があります。dbtは、モデルによって生成された結果についてアサーションを作成することにより、各モデルのSQLの整合性を向上させる方法を提供します。箱から出して、モデル内の指定された列に以下のみが含まれるかどうかをテストできます。
- null以外の値
- 一意の値
- 別のモデルで対応する値を持つ値(たとえば、のacustomer_idはモデルのaにorder対応しidますcustomers)
- 指定されたリストの値
パッケージ管理
dbtにはパッケージマネージャーが同梱されている。PythonのPypiみたいなもの・・・かな
シードファイルローダー
大きくないCSVファイル?などをアップロードする機構とおもわれれる(ELTのLの部分・・・ホント付属の機能の少ない機構とおもわれる)
データスナップショット
DWHのスナップショットを取る事ができる。履歴管理やある時点を再現したい・・・と言ったものに使えそう
生データソースを理解する助けになる
dbtはデータウェアハウスにすでにロードされている生データから選択するため、ウェアハウス内でのこれらのテーブルとスキーマの役割を理解すると便利です。dbtで生データをソースとして定義すると、次のことが可能になります。
- ウェアハウスにロードされたデータを文書化してテストします
- アップストリームの問題を特定するために、指定された制限に対してデータの鮮度を確認してください。
- どのモデルが各データソースに依存しているかを理解します。
(注釈)
データの素性を調べる dbt_profileのようなパッケージもあるそうです。
Who should use dbt?
誰がdbtを使うべき?
dbtは、データウェアハウスとやり取りするすべての人に適しています。これは、データエンジニア、データアナリスト、データサイエンティスト、またはSQLでselectクエリを作成する方法を知っている人なら誰でも使用できます。
プログラミングに不慣れなdbtユーザーの場合は、コマンドラインの基本を理解し、gitに慣れるために時間を費やす必要があるかもしれません。
dbtを最大限に活用するには、モデルでJinjaを効果的に使用するために、forループやifステートメントなどのプログラミングの基本を知っておくと便利な場合があります。
Discussion