10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LineageXでSQLからインタラクティブなカラムリネージのグラフを生成する

Last updated at Posted at 2025-07-15

株式会社ブレインパッド・プロダクトユニット・イノベーション開発グループ
(Rtoaster GenAIなど、新規開発を担っているグループ)の津久井です。

LineageXでSQLのカラムレベルデータリネージを簡単に実現する方法

はじめに

データリネージのOSSはいくつか存在しますが、LineageXは、SQLファイルからカラムレベルのデータリネージを自動的に行い、動的なhtmlによるインタラクティブなグラフを生成してくれます。

(あまり情報が無いOSSの割には、比較的ちゃんと生成してくれます)

サンプルプロジェクト

ミニマムなサンプルコードを用意しました。

プロジェクト構成

lineagex_sample_uv/
├── pyproject.toml        # プロジェクト設定
├── generate_lineage.py   # LineageX実行スクリプト
├── sample_sql/          # 解析対象のSQL
│   ├── stage_sales.sql
│   └── daily_sales.sql
└── README.md

セットアップ

# uvを使用してプロジェクトをセットアップ
uv sync

# LineageXを実行
uv run python generate_lineage.py

サンプルSQL

1. ステージングテーブル(stage_sales.sql)

-- ステージングテーブル
CREATE TABLE stage_sales AS
SELECT
    order_id,
    customer_id,
    order_date,
    amount
FROM raw_sales
WHERE order_date >= '2025-01-01';

2. 集計テーブル(daily_sales.sql)

-- 集計テーブル
CREATE TABLE daily_sales AS
SELECT
    DATE(order_date) AS sale_date,
    SUM(amount)      AS total_amount
FROM stage_sales
GROUP BY sale_date;

3. LineageXを実行するPythonスクリプト(generate_lineage.py)

"""Generate column-level lineage graph using LineageX."""
from pathlib import Path
from lineagex.lineagex import lineagex

def main():
    sql_dir = Path(__file__).parent / "sample_sql"
    lineagex(sql=str(sql_dir), target_schema="public")

if __name__ == "__main__":
    main()

実行結果

実行すると、以下のファイルが生成されます:

  • output.json: データリネージ情報のJSONデータ
  • index.html: インタラクティブな可視化
  • vendor.js: 必要なJavaScriptライブラリ

データリネージ解析の結果

生成されたoutput.jsonから、以下のデータリネージ情報が抽出されます:

{
  "raw_sales": {
    "tables": [""],
    "columns": {
      "order_id": [[""], [""]],
      "order_date": [[""], [""]],
      "customer_id": [[""], [""]],
      "amount": [[""], [""]]
    },
    "table_name": "raw_sales",
    "sql": "this is a base table"
  },
  "stage_sales": {
    "tables": ["raw_sales"],
    "columns": {
      "order_id": [["raw_sales.order_id"], ["raw_sales.order_date"]],
      "customer_id": [["raw_sales.customer_id"], ["raw_sales.order_date"]],
      "order_date": [["raw_sales.order_date"], ["raw_sales.order_date"]],
      "amount": [["raw_sales.amount"], ["raw_sales.order_date"]]
    },
    "table_name": "stage_sales",
    "sql": "SELECT order_id,customer_id,order_date,amount FROM raw_sales WHERE order_date >= '2025-01-01'"
  },
  "daily_sales": {
    "tables": ["stage_sales"],
    "columns": {
      "sale_date": [["stage_sales.order_date"], ["stage_sales.order_date"]],
      "total_amount": [["stage_sales.amount"], ["stage_sales.order_date"]]
    },
    "table_name": "daily_sales",
    "sql": "SELECT DATE(order_date) AS sale_date,SUM(amount) AS total_amount FROM stage_sales GROUP BY sale_date"
  }
}

このJSONファイルには、各テーブルの依存関係やカラムレベルのデータリネージ情報が含まれています。

可視化の確認

生成されたHTMLファイルをブラウザで確認できます:

# 簡易サーバーを起動
uv run python -m http.server --directory .

# ブラウザで http://localhost:8000/index.html を開く

スクリーンショット

  • 全体像

スクリーンショット 2025-07-15 11.45.07.png

  • テーブルを選択

スクリーンショット 2025-07-15 11.46.51.png

  • 「explore」クリックで、テーブルの依存関係を展開

スクリーンショット 2025-07-15 11.47.02.png

  • カラムへのマウスオーバーで、依存関係のグラフを強調

スクリーンショット 2025-07-15 11.47.07.png

まとめ

数多のリネージグラフの生成ツールに比べ、ライトに導入することができる印象です。
(割と苦心していたカラムレベルのリネージがアッサリ実現した。。。。)

html画面上でも他の便利な機能が存在しそうなので、把握し次第また紹介できればと思います。

(続きます)

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?