木曜日, 7月 17, 2025
木曜日, 7月 17, 2025
- Advertisment -
ホームニューステックニュースLineageXでSQLからインタラクティブなカラムリネージのグラフを生成する #bigdata - Qiita

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



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

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

はじめに

データリネージの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画面上でも他の便利な機能が存在しそうなので、把握し次第また紹介できればと思います。

(続きます)





Source link

Views: 0

RELATED ARTICLES

返事を書く

あなたのコメントを入力してください。
ここにあなたの名前を入力してください

- Advertisment -