dbt導入してデータ分析基盤のカオスを解消した話

- ビットキーでアナリティクスエンジニアをしている三河内です
- 2022年時点では以下のような業務を担当しています（アナリティクスエンジニアについての詳細は[こちら](https://www.wantedly.com/companies/bitkey/post_articles/398490)）
![スクリーンショット 2022-11-30 17.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/497a4123-c91e-d8ba-fa75-6df7451fdd9d.png)
- **今回は注力領域であるDWH構築において、2022年10月から取り組んできたdbtの導入について、その 導入背景や実際に使ってみた中でのメリットを紹介します！**

### 想定読者

- データ分析基盤の構築 や データのパイプライン整備をしたいな と考えている方
- データ分析基盤のデータを用いて分析しているデータアナリスト/サイエンティストの方
- dbt(data build tool)の導入を検討している方
    - ちなみにdbtって何？については「[Data Engineering Study 第13回](https://www.youtube.com/watch?v=B0ZTFhczGjs)」でとてもわかりやすく紹介されているので、ご参照ください！

### TL;DR

- dbt導入以前のデータ分析基盤には、`データ生成`と`開発体験`の面で課題があった
- dbtでデータパイプラインを構築したところ、`テーブル間の依存関係`や`テーブルや列の定義`が可視化され、`データの見通し`がよくなった
    - それにより、データモデルのリアーキテクチャなど継続的な視点での開発もやりやすくなった
- データパイプライン開発においても、テストやCI/CDなどのソフトウェア開発のベストプラクティスを取り入れやすく、それにより`開発体験が大幅に改善`した
- 今後もdbtを用いて、`データ分析基盤の開発`や`データの信頼性向上`に取り組んで行きたいと思っており、仲間を求めています！！！

### 目次
[【前提】dbt導入以前のデータ分析基盤](#前提dbt導入以前のデータ分析基盤)
[【dbt導入前】データ分析基盤に溢れるカオス・・・](#dbt導入前データ分析基盤に溢れるカオス)
[【dbt導入後】改善ポイント①：データの見通しが良くなる](#dbt導入後改善ポイントデータの見通しが良くなる)
[【dbt導入後】改善ポイント②：GitHub連携周りの機能により、開発体験が向上した](#dbt導入後改善ポイントgithub連携周りの機能により開発体験が向上した)
[結果：とにかく開発しやすい](#結果とにかく開発がしやすい)
[今後の展望](#今後の展望)

### 【前提】dbt導入以前のデータ分析基盤
- Data LakeとData Martの2層構造で、データモデリングにはまだ取り組んでいない状態でした
![pic.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/2d3bba92-79ef-1c0e-8f39-e74207d67b0e.jpeg)

### 【dbt導入前】データ分析基盤に溢れるカオス・・・

- データ生成の話
    - `テーブル間の依存関係`の把握が辛い
        > 例：XテーブルのY列の算出ロジックを変更したいんだけど、参照しているクエリって何個あるんだっけ？？？
    - `データセット設計`や`データモデルのリアーキテクチャ`をしようにも、結局テーブル間の依存関係の把握が辛い
        > 例：似たような役割を持つテーブルが何個かある、、、消して良いんだっけ？どのデータマートが、そのテーブルを参照しているんだっけ？クエリ全部見て調べないと・・・
    - BigQueryのスケジュールクエリだとパイプラインになってないので、1個クエリがコケてたときに、関連するテーブルの復旧作業が1手で出来ないので辛い
        > 例：データレイク層のテーブルの取り込みがコケてる、、、関連するテーブル全部再実行しないと、ダッシュボードの値が間違ったままだ・・・
- データそのものの話
    - ある列のTimezone が JSTなのかUTCなのかわからないといったような、`データ理解が辛い`
    - 意図してない ID重複やnullなど、見えない恐怖が辛い
- 開発体験の話
    - BigQueryのスケジュールクエリの`設定が煩雑`
    - `クエリ管理`が徹底できない
    - クエリRVを自然なフローで実施できない

### 【dbt導入後】改善ポイント①：データの見通しが良くなる
#### ①：リネージュ機能 が良い！
- このように`ref`でfrom句をくくると、dbtがテーブルの依存関係を自動で判別し可視化してくれます
    - 可視化されることで、テーブルに変更時、影響範囲を調査すべき対象が簡単に判別できるので、効率的かつ安心感です
```sql
-- サンプルデータです
SELECT
  *
FROM
  {{ ref("dim_customers") }} AS dim_customers
```
- このようなフォルダ構成のとき
![スクリーンショット 2022-12-01 12.40.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/c9795689-ba9f-f4d3-36f9-abfe7c30bb06.png)
- 下記のように依存するテーブルを認識し可視化してくれる
![スクリーンショット 2022-11-22 16.30.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/74d00e0e-6a97-e1c3-7799-e3e355310798.png)

#### ②：yaml と ドキュメント生成機能（データカタログ） が良い
- このようにyamlにテーブルの概要や列のスキーマ情報を記載していくことができます
    - その他テストを書くこともでき、例えば重複やnullが無い列であることが担保されている、といった情報も把握できます
        - ref. https://docs.getdbt.com/docs/build/tests
    
```yaml
version: 2

models:
  - name: first_order_amounts_by_customer
    description: 顧客毎の初回購入日の購入金額
    columns:
      - name: customer_id
        description: customer_id
      - name: order_date_jst
        description: 注文日
      - name: amount
        description: 顧客ごとの最初の注文日における購入金額（単位：ドル）
```
    
- この状態でドキュメント生成すると以下のようなデータカタログが自動で生成されます
![スクリーンショット 2022-11-22 16.49.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/690677b9-bff0-c4f7-87c4-8f9aee5a970e.png)
- dbtの閲覧アカウントを付与しておけば、データ分析基盤の開発者以外にもデータカタログを共有できます

### 【dbt導入後】改善ポイント②：GitHub連携周りの機能により、開発体験が向上した
- ①：`Pull Request`したタイミングで、その時点のコードをベースに、自動でデータパイプラインを実行できる
    - この過程でyamlに定義したテストが走るので、ここでテストがコケた場合デプロイしない、といったことが実現できる
    ![スクリーンショット 2022-11-22 17.11.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176356/2569cf47-8303-8337-ff15-7ca5d970981e.png)
- ②：全てがコードベースになるので、BigQueryの`スケジュールクエリの設定も不要`になる
- ③：全てがコードベースになるので、`クエリ管理`も自然にできる
- ④：開発フローがGitHubベースになるので、`クエリRV`も自然なプロセスでできる
- ⑤：開発フローがGitHubベースになるので、GitHub Actionsなどの`CI/CD`ツールに様々な役割を持たせることが出来る
    - SQLのLintチェック や coverageの計測などもCIでできる

### 結果：とにかく開発がしやすい
- ①：`データパイプライン全体の見通し`が良くなるので、データモデリングをする気力が湧く
- ②：`データパイプライン`になるので、1個のコマンドでデータ生成が完了する
- ③：開発に付随する`ドキュメンテーション`や`データ品質のテストの実装`などかゆいところに手が届く

### 今後の展望
- 社内のデータ分析のアジリティを更に上げていきたいと思っており、2023年はdbt開発を軸に以下に取り組んでいく予定です
    - **全事業ドメインのデータをdbtに移行し、データ提供のアジリティを加速させる**
    - **データ分析基盤をビジネス側にも提供していく。誰でも「`select * from hoge where〜`」でデータを抽出し、分析が開始できるように**
- 関連してデータパイプラインの品質のモニタリングと向上をしていきたいと思ってます（DRE的な活動）

#### <font color="#880000">**ビットキーのデータ活用に興味がある方は是非devトークしましょう！**<font>
- [https://jobs.qiita.com/employers/240/dev_talks/441](https://jobs.qiita.com/employers/240/dev_talks/441)

---
12/13は弊社UI/UXデザイナーの @hikari_yyy  さんの投稿です。お楽しみに！