こんにちは。ユニファでデータを活用してプロダクトとビジネスを成長させる仕事をしている浅野です。以前、価値のあるデータ分析基盤をつくるために実践したことについて記事を書きました。その時は開発プロセスの話がメインでしたが、今回はグッと実装寄りの話題として、比較的最近リリースされたdbt Python modelを手軽に使ってみる方法について共有したいと思います。
dbt
dbtは、データ分析基盤におけるELT(Extract, Load, Transform)プロセスのうちTransform部分を実装する際に好んで使われるツールです。下記のような利点がありユニファでも積極的に活用しています。
- SQLのコードをモジュール化することができるため、可読性や再利用性が飛躍的に高まる(モジュール間の依存関係をdbtがよしなに解決してくれる)
- マクロを使ってDRYに記述することができる
- unit testを書いてデータ品質を保つことができる
- 見やすいdocumentを自動生成できる
これらの開発者体験が素晴らしく良いので、もうdbtのない世界には戻れません。
dbt Python model
そんな便利なdbtですが、たまに「このロジックをSQLで表現するのは辛いな。。。」とか「pandas使えば一発なのに。。。」と思うことがあります。そんな思いに応えてくれるのが、dbt v1.3でリリースされたdbt Python modelです。
dbt Python modelでは、次のように(上記公式サイトより抜粋)、まず上流モデルの内容をDataframe形式で受け取り、pandasに近いインターフェースで処理を行い、結果をDataframe形式で返します。
import ... def model(dbt, session): my_sql_model_df = dbt.ref("my_sql_model") final_df = ... # stuff you can't write in SQL! return final_df
もちろん好きなLibraryをimportすることもできますし、関数を定義することもできます。これでSQLの制約から解き放たれて自由にデータモデリングできますね。
dbt-fal
ユニファではデータウェアハウスとしてBigQueryを採用しています。BigQueryを使う場合、dbt Python modelはDataprocという(SparkやHadoopといった分散処理フレームワークのマネージド)サービス上でPySpark Jobとして実行されます。ただ、「ちょっと動作を確認してみたいだけ」であったり「分散処理が必要なほどデータ量がない」ような場合にDataproc clusterを動かすのは大げさな気がします。
そんな時に手軽に使えるのがdbt-falです。dbt-falを使うと、Dataprocではなく(ローカルPCなどの)dbtの実行環境上でPython modelを実行することができます。pipでインストールしてdbtの設定ファイル(profiles.yml)を少し書き換えるだけでPython modelを使うことができ、リソースのプロビジョニングなどを別途行う必要がないのでとても楽です。
ユニファのデータ分析基盤でも、SQLで書くことがどうしても難しいビジネスロジックの実装にdbt-falを活用しています。
まとめ
dbtのPython modelを手軽に使い始めることができるdbt-falについて書きました。dbtには「データモデルの定義と実行は分離されるべきである」という設計思想があるため、dbt Pythom modelも同様の思想を引き継いでいるのは自然なことです。もしその点が重要である場合には、localでdbtの実行を行うdbt-falを採用するのは適切ではないかもしれません。そうではなく、かつ分散処理をしなくてもパフォーマンスが許容できる場合にはdbt-falは有効な選択肢となると思います。
データエンジニアのリソースがデータ分析基盤を活用する上でのボトルネックになってしまうのは良くないので、SQL(と最低限のgit)を理解していれば誰でもデータのTransformを実行できるように環境整備をしています。そのため、いくらPythonが使えるようになったとしても、SQLで問題なく書けるものについては引き続きそうしていきますが、Pythonで書くことによって大幅に可読性や効率性が改善する場合には、これからもdbt Python modelを活用していくつもりです。
この記事が、これから「dbt Python modelを使ってみよう」と思っている方のお役に立てれば幸いです。