[dbt] Analysesでアドホックなクエリを開発する

2022.01.17

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

今回は「使うのは簡単だけど、使いどころがイマイチよくわからない」って感じの機能であるAnalysesをご紹介します。

Analysesとは

dbtプロジェクトの中にanalysesというディレクトリがあるのですが、その中にSQLファイルを配置することができます。そのクエリ群をAnalysesと呼称します。

dbtユーザーの方からすれば、「dbtプロジェクトの中にあるSQLファイル」って、それってModelじゃないの??って感じですよね。ですので、Modelとの違いを記します。

  • dbt runの対象外
  • 実体化されない(テーブルやビューにならない)
  • Jinjaやマクロ等は使える(Modelを開発するときと全く同じ環境でSQLが書ける)

つまり、dbtの中にあるんだけども、実際にデータは作らないSQLがAnalysesといえます。

使いみち

上記を見ると、「どこで使う機能なんだ?」と疑問を持たずにいられない感じですが、個人的に思いつくのは下記の通りです。

単発クエリ

データモデルを開発している中で、実際に作る前に、検証等でちょっと一時的に実行したいクエリっていうのが出てきます。

普通のSQLクライアントとかでやってもいいのですが、Analysesで行うことで、「Jinjaやマクロを使ってSQLが書ける」「dbtプロジェクトとしてバージョン管理ができる」というメリットを享受できます。

BIツール用のクエリ

TableauやLookerといったBIツールには、そのツールからSQLを発行して、それで取得したデータを分析する、という機能があります。

こちらも、別にBIツール上でSQLを書いてもいいのですが、上記同様、Analysesを使用することで、dbtのメリットを活かしながら、BIツール用のクエリを開発することができます(まあ、BIツール用なんだったら、ちゃんとModelとしてテーブルやビューを作ってあげるにこしたことはないと思いますが)。

やってみた

環境

  • dbt Cloud
    • dbt v1.0

analysesディレクトリ下にSQLファイルを作成する

やることは単純です。見出しの通り、SQLファイルを用意します(クエリはLearn Analytics Engineering with dbt | dbt Learnのものをお借りします)。

total_revenue.sql

WITH payments AS(
	SELECT
		*
	FROM
		{{ ref('stg_payments') }}
),

aggregated AS(
	SELECT
		SUM(amount) AS total_revenue
	FROM
		payments
	WHERE
		status = 'success'
)

SELECT
	*
FROM
	aggregated

で、このクエリなのですが、結果は1つの値が返ってくるだけです。こういうModelにするようなデータではない…というものも、analysesの使いどころかなと思います(それこそBIツール側に渡してあげても良さそう)。

また、このクエリにはrefを使って、別のデータモデルを参照していますが、当然ながら、コンパイル後は、ちゃんとしたクエリになります。

Jinjaやマクロを活用して、効率良く「一時的なクエリ」が書けるというわけですね。

dbt compileする

dbt Cloudであれば、上記のように、画面上で気軽にクエリをコンパイルすることができますが、一応、正式なコンパイル方法としては、dbtコマンドのdbt compileを実行することです。このコマンドは、dbtプロジェクトのModelやAnalysesのクエリをコンパイルしてくれます。

コンパイルされたクエリは、targetディレクトリ下に作成されます。

おわりに

使いどころが絶妙な機能ではありますが、結果をテーブルやビューとして作るまでもないクエリについては、Analysesで書いてみるのも良いと思います。