データエンジニア界隈で話題のdbt（data build tool）のまとめ

## 概要
データエンジニア界隈で話題となってきたdbtに関する調査内容を共有します。
OSS版のdbtでも機能が充実しており、データエンジニアの方には一部の機能の利用だけでも価値があるツールです。

必要に応じて、この記事を更新します。

## dbt（Data Build Tool）とは
dbtとはData Build Toolの略であり、dbt Labs社が開発しているデータ連携のELTにおけるT（データストア内でのデータ変換）の実施をサポートするツールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/540211b8-3883-89ec-edff-7320fc774028.png)


機能をざっくり整理すると下記のものがあり、SQL文のコンポーネント化やドキュメントの自動生成に特異性があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/555a7473-37fe-512e-e7ea-015cd026491b.png)

有償版であるdbt cloudとOSS版であるdbt Coreがあります。dbt cloudにて、developer版という個人検証用の無償ライセンスもあるので、とりあえず触りたい方はこちらがおすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f1a197b6-2de4-2cca-097d-035831de2e32.png)

引用元：[dbt Pricing Plans (getdbt.com)](https://www.getdbt.com/pricing/)

## ツールの特徴

1. データの実体化方法としては、ビューの生成、CTAS（CREATE TABLE AS SLECT）、増分更新、差分更新（MERGE）、差分履歴更新（SCD Type2相当）がある。カスタマイズも可能であり、データ連携先データストアの製品特徴に応じて処理を自動で実施。
2. SQL文を発行するツールであることから、dbtの実行環境のスケールをあまり考慮する必要はない。データをロードする機能は基本的にはなく、データ連携済みであることが前提。
3. 結合キーは単一列であることが推奨されており、複数カラムの値をハッシュ化する方法（[Generating Surrogate Keys Across Warehouses | dbt Developer Blog (getdbt.com)](https://docs.getdbt.com/blog/sql-surrogate-keys)）が紹介されている。
4. テスト機能にて、ユニークキー制約性チェック、NOT NULL制約チェック、ドメイン制約、及び、外部キー制約チェックがあり、SQLによりテストケースを作成することが可能。dbtにはデータロード機能がないことから、システムテストの実施は別途必要。
5. dbt_utils（[dbt - Package hub (getdbt.com)](https://hub.getdbt.com/dbt-labs/dbt_utils/0.1.7/)）などの公開されているパッケージを利用することで、先駆者の知見を拝借可能。
6. ドキュメント機能にて、dbt cloud（有償サービス）を利用しない場合には、自前でホストする環境で共有（[Deploying the documentation site | dbt Docs (getdbt.com)](https://docs.getdbt.com/docs/building-a-dbt-project/documentation#deploying-the-documentation-site)）する必要がある。
7. ドキュメント機能にて、データ連携に関する情報だけでなく、データ活用に関する情報（[Exposures ](https://docs.getdbt.com/docs/building-a-dbt-project/exposures)、[Analyses](https://docs.getdbt.com/docs/building-a-dbt-project/analyses)、[Metrics](https://docs.getdbt.com/docs/building-a-dbt-project/metrics)等）を、yaml、あるいは、Markdownで記述可能。


## 利用シナリオ

利用シナリオには下記がある。

| #    | シナリオ                             | 概要                                       |
| ---- | ------------------------------------ | ------------------------------------------ |
| 1    | データ連携SQLとドキュメントの生成    | データ連携処理のSQLとドキュメントを生成。  |
| 2    | データ連携処理パイプラインの個別実行 | 個別のデータ連携処理パイプラインを実行。   |
| 3    | データ連携処理パイプラインの全体実行 | 複数のデータ連携処理パイプライン群を実行。 |


## dbtに関する情報源
### 製品関連情報

| #    | サイト                                                       | 概要                     |
| ---- | ------------------------------------------------------------ | ------------------------ |
| 1    | [dbt Docs (getdbt.com)](https://docs.getdbt.com/)            | ツールの公式ドキュメント |
| 2    | [dbt-labs/dbt-core:   dbt enables data analysts and engineers to transform their data using the   same practices that software engineers use to build applications.   (github.com)](https://github.com/dbt-labs/dbt-core) | 実際のコード             |
| 3    | [dbt Community Discourse (getdbt.com)](https://discourse.getdbt.com/) | 公式のコミュニティサイト |
| 4    | [dbt blog (getdbt.com)](https://blog.getdbt.com/)            | 公式ブログ               |
| 5    | [Join the dbt Community (getdbt.com)](https://www.getdbt.com/community/) | slack                    |



## dbt の概要を理解するためのページ

| #    | ページ                                                       | 概要                                    |
| ---- | ------------------------------------------------------------ | --------------------------------------- |
| 1    | [What is   dbt? dbt Docs (getdbt.com)](https://docs.getdbt.com/docs/introduction) | ドキュメントの最初のページ。            |
| 2    | [What,   exactly, is dbt? (getdbt.com)](https://blog.getdbt.com/what-exactly-is-dbt/) | dbtがどういったものであるかが説明。     |
| 3    | [Setting   up dbt Docs (getdbt.com)](https://docs.getdbt.com/tutorial/setting-up) | 基本チュートリアル。                    |
| 4    | [List of FAQs dbt Docs (getdbt.com)](https://docs.getdbt.com/faqs/all) | dbtに関するよくある質問に対する回答集。 |
| 5    | [Learn Analytics Engineering with dbt dbt Learn (getdbt.com)](https://courses.getdbt.com/collections) | 無償のオンライントレーニング。          |
| 6    | [Available adapters dbt Docs (getdbt.com)](https://docs.getdbt.com/docs/available-adapters) | 利用可能なデータストアサービスの記事。  |
| 7    | [The Analytics Engineering Guide (getdbt.com)](https://www.getdbt.com/analytics-engineering/) | データ活用におけるデータエンジニアリングを実施する際のガイド |

## サンプルコード

| #    | ページ                                                       | 概要                                         |
| ---- | ------------------------------------------------------------ | -------------------------------------------- |
| 1    | [dbt-labs/jaffle_shop:   A self-contained dbt project for testing purposes (github.com)](https://github.com/dbt-labs/jaffle_shop) | 架空のeコマースストアのデモ                  |
| 2    | [dbt-labs/mrr-playbook   (github.com)](https://github.com/dbt-labs/mrr-playbook) | サブスクリプション収益をモデル化するデモ     |
| 3    | [dbt-labs/attribution-playbook   (github.com)](https://github.com/dbt-labs/attribution-playbook) | マーケティングをモデル化するデモ             |
| 4    | [transform/snowflake-dbt   · master · GitLab Data / GitLab Data Team · GitLab](https://gitlab.com/gitlab-data/analytics/-/tree/master/transform/snowflake-dbt) | Gitlab社が社内で利用しているシステムのコード |

### 開発ベストプラクティス

| #    | ページ                                                       | 概要                                  |
| ---- | ------------------------------------------------------------ | ------------------------------------- |
| 1    | [Best   practices  dbt Docs (getdbt.com)](https://docs.getdbt.com/docs/guides/best-practices) | dbtドキュメント上のベストプラクティス |
| 2    | [dbt   Guide  GitLab](https://about.gitlab.com/handbook/business-technology/data-team/platform/dbt-guide/) | Gitlab社の開発標準                    |
| 3    | [corp/dbt_style_guide.md at master · dbt-labs/corp (github.com)](https://github.com/dbt-labs/corp/blob/master/dbt_style_guide.md) | dbt社推奨のコーディング規約           |

### dbtにより生成されるドキュメントのサンプル

| #    | ページ                                                       | 概要                                  |
| ---- | ------------------------------------------------------------ | ------------------------------------- |
| 1    | [dbt Docs (getdbt.com)](https://www.getdbt.com/mrr-playbook/#!/overview) | サブスクリプション収益をモデル化するデモ |
| 2    | [dbt Docs (getdbt.com)](https://www.getdbt.com/attribution-playbook/#!/overview) | マーケティングアトリビューションをモデル化するデモ |
| 3    | [GitLab dbt Docs (gitlabdata.com)](https://dbt.gitlabdata.com/#!/overview) | Github社のシステムのドキュメント           |

## 関連記事
次の記事はdbtをより深く理解するための記事です。

https://qiita.com/manabian/items/ab6c2a5dde78c432ecf1