Censusを使ってdbtのデータモデルをクラウドサービスに直接連携する

census + dbt = magic
2021.03.15

大阪オフィスの玉井です。

Censusは、DWHに入っているデータを、SaaSに直接連携できる便利なサービスです。しかし、Censusはそれでだけでなく、データ変換ツールのdbtと連携することができます。

今回は、DWHのデータを直接指定するのではなく、dbtのデータモデル(のデータ)をSaaSに連携してみました。

やってみた

全体像

BQに入れたSalesforceのデータがあります。これをdbtで変換処理をして、その変換後のデータを、Zendeskに連携します。

Censusは、接続したDWHのテーブルやビューのデータを、色々なSaaS等に直接連携することができます。それに加えて、連携元として、テーブルやビューではなく、dbtで作成したデータモデルを使用することができます。

dbtは、データモデルをSQL(+Jinja)で定義しますが、その(dbtモデルの)実行を、Census側で行うことができます。予めdbtモデルを生成しておくのではなく、Census側の連携に合わせて、Census側からdbtをキックする感じです。

Censusは、dbtのコード群が格納されているGithubのリポジトリを参照して、dbtを実行します。

やってみた環境

  • macOS Catalina 10.15.7
  • dbt CLI 0.19
  • Census
    • トライアル版

一応、2021年3月現在、Censusがサポートしているdbtのバージョンは0.18であることを、ここに記しておきます。

下準備

データまわり

下記の記事で使用した環境を継続して使います。準備方法等についても下記を御覧ください。

dbtでデータモデルを用意

Censusでdbt連携を行うにあたり、dbtのデータモデル(が書かれたProject)をGithubに上げておく必要があります。

上記の記事中ではFivetranのTransformation機能で、事前にテーブル結合を行っていましたが、今回はそれをdbt側で行います。具体的には、下記のデータモデルをCensus側から利用します。

models/account_plus.sql

SELECT a.*, b.name as owner_name
FROM {{ source('salesforce','account') }} as a
LEFT JOIN {{ source('salesforce','user') }} as b on a.owner_id = b.id

models/model.yml

version: 2

sources:
    - name: salesforce
      database: tamai-rei
      schema: salesforce_us
      tables:
        - name: account
        - name: user

これらを含むProjectを、Githubのリポジトリにプッシュしておきます。

Censusにdbtモデルを登録する

今回のメインはここからです。まず、先程用意した(dbtのコードがある)Gitリポジトリを、Censusの「Model」として登録します。

「Models」というページから、「Load models from dbt project」というメニューに行きます。

リポジトリを選ぶメニューからリポジトリ追加のメニューを選ぶと、Githubのページに遷移するので、そこで登録するリポジトリを選びます。

リポジトリの設定後、残りの設定として、使用するブランチやパス等を設定します。最後のTarget〜の設定は、dbt側(データモデルの生成ロジック側)で、中間モデルの生成を挟むようになっている場合、それらを格納するスキーマ名を指定するものになっています。

接続に成功すると、Census側がdbt Projectを解析しはじめるので、少々待ちます。今回はめちゃくちゃ軽いProjectなので、1分もかからないうちに終わりました。大規模のProjectになると、もう少し時間がかかるかもしれません。

解析が終わると、Census側からモデルの一覧を確認することができます。今回使うのはaccount_plusです。

Census上で、データモデルの確認と、実行結果のプレビューができます。

dbtモデルを使ったSyncを設定する

dbt projectを登録できたら、それを利用したSyncを作成します。

Connectionは連携元を設定する部分になりますが、今まではここがDWHのテーブルやビューを選んでいたのが、今回はdbtのモデルを使うので、そちらを選びます(選べるようになっている)。

後の内容は前回(冒頭に紹介した記事)と同じです。

諸々の設定完了後、実際にSyncを実行してみます。

連携されたかどうか確認

実際に連携されているかどうか、Zendesk側を確認します(以前、同じ内容で連携したので、Zendesk側で色々消して、もう一度新規データとして連携しました)。

dbtで定義したデータモデル(BQに直接存在しないテーブル/ビュー)が連携されています。

ちなみに、BQ側のクエリ履歴を見ると、Censusがdbtのデータモデルを実行していることがわかります。この仕様を把握しておくことは結構大事です。なぜなら、dbt側で色々なテーブルやビューを利用するような処理が書かれていても、それを実行するCensus側に、それらのテーブル等を参照できる権限がなければ、実行できないからです。

おわりに

本記事の冒頭にも書いたとおり、Censusは、DWHに入っているデータを、SaaSに直接連携できる便利なサービスです。そして、(正しく運用されているデータ分析基盤の)DWHには、新たなデータが蓄積され続けます。それゆえ、各種SaaSにも、なるべく最新のデータを常に連携し続けたいと考えます。その時、連携したいデータをdbtで作っている場合、dbtとCensusの実行スケジュールをうまく調整する必要があります。しかも、データ量によっては、dbt側の処理が終わりきらない間に、Census側の実行が始まってしまうリスクもあります(最新のデータが連携されなくなる)。

しかし、今回の連携を行えば、Censusの連携時にdbtも連動させるため、2者間における実行時間のスケジューリングで苦しむことが無くなります。連携されるデータも常に最新のものとなります。非常に便利な連携だと思いました。

ちなみに、私が見た限り、今のところは対応リポジトリサービスがGithubしかないので、他のGitサービスも対応されると嬉しいと思いました。