dbtで作成したデータモデルをそのまま可視化に使えるBIツール「Lightdash」を使ってみた

ダッシュ!四駆郎
2021.09.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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

今回は、dbtにネイティブ対応しているBIツールを紹介します。

Lightdashとは

名前の通り、ライトなBIツールなのですが、接続先がDWHではなく、dbtプロジェクトなのが特徴です。

dbtを使う理由の1つに、BIツールで分析しやすいデータを用意する、というものがあると思います。普通は、dbtを通してDWH上にできたテーブルやビューを、別途BIツールで接続して利用します。しかし、Lightdashは、DWHを介すのではなく、直接dbtのコードを利用して可視化を行います(裏側としては、dbtのコードを利用して、dbtの後ろにあるDWHにクエリを実行するようになっています)。

やってみた

今回はローカルで試します。OSSなので無料です(有料版については後述)。

環境

  • macOS 11.5.2
  • dbt CLI 0.20.1
  • docker 20.10.8

dbtを接続しているDWHはBigQueryです。

前提など

dbtプロジェクトを参照するツールなので、既に(正常に動作する)dbtプロジェクトがあることが前提です。

インストール(準備)

Lightdashが入ったコンテナがGithubにあるので、それを持ってきます。

$ git clone https://github.com/lightdash/lightdash

Lightdashのディレクトリに移動します。そして、いくつか環境変数を設定します。今回のdbtプロジェクトは、BQをOAuth認証で接続しているので、gcloudに関する情報も設定してあげる必要があります。

$ cd lightdash
$ export DBT_PROJECT_DIR=<可視化したいdbtプロジェクトのパス>
$ export DBT_PROFILES_DIR=<dbtのprofiles.ymlのパス>
$ export GCLOUD_CONFIG_DIR=<gloud SDKのパス>

一通り設定できたところで、コンテナを起動します。

$ docker compose -f docker-compose.yml -f docker-compose.service-account.yml up

画面の確認

起動に成功すると、下記が表示されますので、Webブラウザから接続します(主張?がすごい)。

...

lightdash_1  |    |     |     |     |     |     |     |
lightdash_1  |    |     |     |     |     |     |     |
lightdash_1  |    |     |     |     |     |     |     |
lightdash_1  |  \ | / \ | / \ | / \ | / \ | / \ | / \ | /
lightdash_1  |   \|/   \|/   \|/   \|/   \|/   \|/   \|/
lightdash_1  | ------------------------------------------
lightdash_1  | Launch lightdash at http://localhost:8080
lightdash_1  | ------------------------------------------
lightdash_1  |   /|\   /|\   /|\   /|\   /|\   /|\   /|\
lightdash_1  |  / | \ / | \ / | \ / | \ / | \ / | \ / | \
lightdash_1  |    |     |     |     |     |     |     |
lightdash_1  |    |     |     |     |     |     |     |
lightdash_1  |    |     |     |     |     |     |     |

...

ユーザー登録みたいなのが表示されるので、素直に入力します(何に使われるのか不明)。

Lightdashのトップページが表示されました!

左側には、dbtで定義されているデータモデルが選べます。これをテーブルに見立てて(実態はテーブルですが)、ビジュアライズしていく感じですね。

ymlファイルに記述しているメタデータを拾ってきてくれているようです。また、モデル間のリネージも確認できます。

…ディメンションとかが全く選べない…?

DimensionsとMetricsを定義する

Lightdashは、分析したいカラム(dimensionとmetrics)を、schema.ymlファイルから拾います。ですので、ここをちゃんと書いていないと、フィールドが一切出てこず、何の分析もできません。

というわけで、今回使用するデータモデルについて、ちゃんとymlファイルで定義してきます。

version: 2

models:
  - name: dim_customers
    description: "顧客の購買データを集計したもの"
    columns:
      - name: customer_id
        tests:
          - unique
          - not_null
      - name: first_name
      - name: last_name
      - name: first_order_date
        description: "初回購入日"
      - name: most_recent_order_date
        description: "直近購入日"
      - name: number_of_orders
        meta:
          metrics:
            sum_number_of_orders:
              type: sum
      - name: lifetime_value
        meta:
          metrics:
            sum_lifetime_value:
              type: sum

テストやdescriptionをしっかり記述しているプロジェクトの場合は、改めて書くことはほとんどありません(今回は検証用にテキトーなプロジェクトを使っているので、ほとんどまともに書いてなかった)。

dimensionについては、他のBIツールと同じく、文字列等の計算できない項目を指します。これはcolumnsで定義するだけでLightdash側にも反映されます。

metricsというのは、他のBIツールでいうメジャーです。計算できる項目を指します。これはcolumns(とname)だけではダメで、その後にmetametrics<metricsの名前>typeと書いていく必要があります。typeは集計方法を指定します。sumとかAverageとかcountとかです。

一通り定義してLightdash側をリフレッシュすると、下記のように、フィールドが出揃います。

可視化してみる

後は普通のBIツールのような感じで使います。フィールドを選んでRun Queryを押すだけです。簡単なビジュアライズが出てきます。

裏側のSQLもわかります。

フィルターもかけれます。

今回はやっていませんが、モデル同士のJoinもできます(必要な結合はdbt側で済ませているので、あまり必要性を感じない…)。

有料版について

今回使用したのはOSS版ですが、なんとクラウド版が準備中とのことです(要するにSaaS)。

※公式サイトのPricingより

現在プライベートベータということで、触りたい方は応募しましょう。

感想など

触っていて一番感じたのが「Lookerっぽさがある?」でした。

ビジュアライズ画面の構成がExploreっぽいのもありますが、dimensionとmetricsをコードで定義するところが、LookMLを想起させました。とはいえ、前述したように、しっかりしたdbtプロジェクトであれば、ある程度はすでに定義済みだとは思います。しかし、metricsに関しては、Lightdashを使うようになって初めて書くことになるはずなので、ここはLookMLでmeasureを書いている時とすごく被ります。

Lookerが「LookMLというコードを介してSQLを動的に生成する」に対し、Lightdashは「dbtのコードを介してSQLを動的に生成する」なので、発想が似ている(そもそもLooker起点?)のかなあ、と思ったりしました。

「うーん」という部分は、やはり可視化(ビジュアライズ)の力でしょうか。もうほんとのほんとに最小限の機能しかないので、これで本番相当のダッシュボードを作るというのは、正直キビシイと思いました。

おわりに

少しづつですが、dbtと連携するツールというものが増えてきています。それだけdbtが普及してきているということですね。今後も要チェックです。