🏎️

dbt Fusion engineのcolumn lineage機能を試してみた

に公開

こんにちは、stable株式会社のmyshmehです。

日本時間2025年5月29日未明に新たなdbtエンジン、Fusionが公開されました。
https://github.com/dbt-labs/dbt-fusion?tab=readme-ov-file

本記事では、早速Fusionおよびその対となるdbt extensionをインストールし、新機能カラムリネージを試します。デモとして、自分が過去にosmosisとsdfを比較した下記記事を引用して、複雑なカラム変更にも耐えるFusionの底力をご紹介しようと思います。
https://stable.co.jp/blog/dbt-osmosis-vs-sdf

デモ環境

自分の記事で使ったmyshmeh/osmosis_vs_sdfレポジトリを引用します。特に、以下のモデルを使っていきます。

早速dbt extensionで本記事のmodel lineageを表示してみました

モデルコートは以下の通りです。

parent.sql
with source_data as (
    select
      1 as columnA,
      1 as column_b
)
select *
from source_data
child2.sql
select
  columnA as column_a,
  column_b as columnB
from {{ ref('parent') }}
child3.sql
select
  columnA as column_b,
  column_b as columnA
from {{ ref('parent') }}

デモ内容

過去のosmosis vs sdf記事では、osmosisのカラム追従ロジックが下図のようにchild2, child3のカラムリネームをうまく捉えられなかったことを課題に挙げていました。

osmosisのロジックだと、child2のカラムリネームを捉えられなかった


child3でも、カラムの追従があべこべに

それでは、Fusion engineがこれらの問題を乗り越え、正しくカラムリネージを出力できるのか見ていきましょう!

インストール

以下のコマンドで、dbt Fusion engineをインストールします。

curl -fsSL https://public.cdn.getdbt.com/fs/install/install.sh | sh -s -- --update

dbtf --versionを実行して、以下のようなoutputが出ればインストール完了です。

dbt-fusion 2.0.0-beta.12

続いて、vscode (またはcursor)のdbt extensionをインストールします。
vscode (またはcursor)のExtensionsタブで、"dbt"と入力すれば出てきました(発行元がdbt Labs Incであるかに注意が必要です)。

Windsurfは対応しているの?

執筆時点では、Windsurfにはdbt extensionが公開されていないようです。
ただ、公式Slackのdbt-fusion-engineチャンネルで、検討するような記述が見られたので、将来的には公開されるかもしれません。

デモ

では、実際にカラムリネージが正しく表示されるか見ていきましょう!

まずはモデルリネージ

まず、全体のモデルリネージを表示しましょう。
ファイルExplorerから、parent.sqlを右クリックし、dbt: View Lineage >> Show Project Linegaeと選択しましょう。

すると、エディタ下部の「LINEAGE」欄に、モデルリネージが表示されます。

いよいよカラムリネージ!

それでは、カラムリネージを表示し、parentからカラムがどのように変遷していくかみていきます。

おさらいとして、child2, child3モデルは、次のように定義されています。

child2.sql
select
  columnA as column_a,
  column_b as columnB
from {{ ref('parent') }}
child3.sql
select
  columnA as column_b,
  column_b as columnA
from {{ ref('parent') }}

最初に、リネージ図中のparentモデルを右クリックし、Show column lineageを選択します。

すると、どのカラムリネージが見たいかプロンプトされます。ここでは、COLUMNAを選択してみます。

parent.columnAがdownstreamモデルでどうリネームされたか、正しく表示されました!同様に、parent.column_bについても、実態に即したカラムリネージが表示されることを確認できます。

ちなみに: ノードからファイルを開けます

ノードを右クリックからOpen fileを選択またはダブルクリックすると、該当するモデルをエディタで開くことができます。地味ですが、嬉しい開発体験です。

リネージはリネームだけじゃない!

次に、カラムの値を加工すると何が起きるでしょうか?試しに、child3_1.sqlを作成し、以下のようにchild3のカラム同士を足してみます。

child3_1.sql
with child3 as (
    select * from {{ ref('child3') }}
),
final as (
    select
        column_b + columnA as column_mixed
    from child3
)
select * from final

先ほどと同様の手順でカラムリネージを表示してみると、TRANSFORMATIONという形で上流カラム同士を足したことが表現されています!

このように、dbt extensionのカラムリネージでは、カラムの変容について以下をトラッキングできます。

  • PASSTHROUGH: そのまま上流カラムを使った
  • RENAME: 上流カラムをリネームした
  • TRANSFORMATION: 上流カラムを加工した

今までdbt cloudでは提供されていましたが、この機能がsource-available(ELv2ライセンス)な形で我々の元に提供されたのは、大変ありがたいですね。

残念ながら、現状ではdescriptionの伝播機能はFusion、dbt extensionのどちらにもなさそうです。しかし、Fusionの技術アプローチでは可能なことなので、いつかosmosisのような機能が追加されることは期待できます!

まとめ

いかがでしたでしょうか?本記事では、FusionによるSQLの静的解析が、厳密なカラムリネージを実現することをご紹介しました。dbt power userでもカラムリネージは提供されていますが、これはAIを用いた確率的なアプローチなので、正確性の側面ではFusionに軍配が上がりそうです。

そもそも、なぜFusionにこのような機能が実現できてdbt-coreにはできなかったのか、その核心を知りたい方は、ぜひ自分の過去の記事をご参照いただければ嬉しいです。また、6/17(Tue)開催のdbt tokyo#14でもFusionの技術的な魅力について詳細にお伝えしようと思いますので、ぜひご参加ください。
https://www.meetup.com/tokyo-dbt-meetup/events/307814712/

Discussion