医療職からデータサイエンティストへ

統計学、機械学習に関する記事をまとめています。

BigQueryとdbtを接続!最強のデータ基盤

近年話題のdbtは、データエンジニアリングの分野で使われるオープンソースのコマンドラインツールです。特に、データウェアハウス内でのデータ変換(ETL:Extract, Transform, Loadの「Transform」部分)作業を効率化するために設計されていて、以下の点が特徴です。

  • SQLによる処理: データエンジニアやアナリストがSQLを書いてデータ変換を行う。

  • バージョン管理: gitなどのバージョン管理システムと連携し、データ変換のプロセスを追跡できる。

  • テストとドキュメンテーション: データモデルの品質を保証するためのテストを作成し、ドキュメンテーションを自動生成することができる

  • ワークフローの自動化: データ変換プロセスを自動化し、複雑なリレーションをを管理しやすい。

  • パフォーマンス最適化: データウェアハウスの性能を最適化するための機能を備えており、大規模なデータセットに対しても効率的に動作する。

  • コミュニティとエコシステム: 活発なコミュニティがあり、多くのプラグインや追加機能が開発されている。

今回は、そんなdbtをローカルからBigqueryに接続してみましたので、一連の流れについて書いていきます!

dbt cloudを使用することもできるのですが、開発時のテストなどはローカルから実行できたほうが何かと便利ですもんね。

事前準備

まずは、以下の事前準備を行います。

Bigqueryの事前準備

GCP側の事前準備についての詳細は割愛し、やったことの紹介のみとしますm(__)m

各種事前知識や設定に関しては、こちらを参考にしました。

  • GCPのプロジェクト作成
    • 任意のプロジェクト名で作成
  • IAM管理画面にてサービスアカウントの作成
    • 任意の名前で作成
    • ロールにはBigQuery 管理者ストレージ管理者を付与する。
    • 本来ストレージ管理者は不要だが、クラウドストレージの外部テーブルを使用する場合は付与する。
  • 作成したサービスアカウント認証情報のダウンロード
    • json形式で鍵をダウンロードする。

dbtの事前準備

次にdbtの設定です。 まずは、ローカルにdbtをインストールします。色々な方法がありますが、今回はpipを使います。

# インストール
pip install dbt-bigquery

# バージョンの確認
dbt --version
Core:
  - installed: 1.7.1
  - latest:    1.7.1 - Up to date!

Plugins:
  - bigquery: 1.7.2 - Up to date!
ちなみに、、
dbtは他にも様々なデータソースコネクタが使用できます。
Install with pip | dbt Developer Hub
pip install \
  dbt-core \
  dbt-postgres \
  dbt-redshift \
  dbt-snowflake \
  dbt-bigquery \
  dbt-trino

インストールが終われば、プロジェクトを作成します。

dbt init

すると、プロジェクト名やGCPのプロジェクトID、認証の方法(今回は、service_accountでの認証)、認証情報ファイルのパスなどが聞かれますので、順番にこたえていきます。

すべて、こたえ終わるとホームディレクトリの配下に.dbt/profiles.ymlができあがり、中身はこんな感じです。

<dbtプロジェクト名>:
  target: dev
  outputs:
    dev:
      dataset: <bigqueryデータセット名>
      job_execution_timeout_seconds: 300
      job_retries: 1
      keyfile: <認証情報のPATH>
      location: US
      method: service-account
      priority: interactive
      project: <GCPプロジェクトID>
      threads: 1
      type: bigquery

できあがったプロジェクトフォルダーは以下のような構成になります。 このmodelsフォルダーに、各種モデル定義のSQLを置いていくわけですね。

├── README.md
├── analyses
├── dbt_packages
├── dbt_project.yml
├── logs
│   └── dbt.log
├── macros
├── models
│   └── example
│       ├── my_first_dbt_model.sql
│       ├── my_second_dbt_model.sql
│       └── schema.yml
├── seeds
├── snapshots
└── tests
ちなみに、、
実は、`dbt init`をしなくても、上記のようなフォルダー構成や、`profiles.yml`、`dbt_project.yml`などさえあれば、dbtは動きます。あとから環境を追加したりするときは、直接yamlを編集します。

実際にやってみる。

さて、それでは、事前準備ができましたので、実際に動作チェックです。以下のコマンドです。dbt initで作成したプロジェクトには、あらかじめサンプルテーブルができるようになっているので、実行してみます。

dbt run

うまくいけば、Bigqueryのデータセットに、my_first_dbt_modelmy_second_dbt_modelができあがっているはずです!

まとめ

BigQueryは、単独でも強力なデータレイク、ウェアハウスとなりますが、そこにdbtを連携させることで、より管理がしやすく、モダンな分析環境となりそうですね!

※本記事は筆者が個人的に学んだこと感じたことをまとめた記事になります。所属する組織の意見・見解とは無関係です。