Unity Catalogのリネージ機能のウォークスルー

気づかない間に機能エンハンスされていたので、改めてウォークスルーします。

https://docs.databricks.com/ja/data-governance/unity-catalog/data-lineage.html

# リネージとは

日本語では依存関係や系統情報と訳されます。要はデータやモデルの依存関係です。以下はすべてリネージです

- あるノートブックであるテーブルが作成された
- あるテーブルが別のテーブルやファイルから作成された
- あるモデルではあるテーブルの特徴量を利用している
- あるダッシュボードであるテーブルのデータを表示している

# Databricksにおけるリネージ機能

Databricksのガバナンスソリューション[Unity Catalog](https://www.databricks.com/jp/product/unity-catalog)で管理されているテーブル、モデル、ファイルなどの資産間のリネージは**自動で**キャプチャされます。何も追加で作業する必要はありません。

以下のようなリネージグラフを参照することで、テーブルの由来をクイックに確認することができます。
![Screenshot 2024-02-28 at 18.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/961d0f46-1a59-2efd-30da-be2a79bf3bd4.png)

# ウォークスルー

自分で使うカタログとスキーマ(データベース)を準備します。

```sql:SQL
USE CATALOG takaakiyayoi_catalog;
```
```sql:SQL
CREATE SCHEMA lineagedemo;
USE lineagedemo;
```

いくつかテーブルを作成します。

```sql:SQL
CREATE TABLE IF NOT EXISTS
  takaakiyayoi_catalog.lineagedemo.menu (
    recipe_id INT,
    app string,
    main string,
    dessert string
  );

INSERT INTO takaakiyayoi_catalog.lineagedemo.menu
    (recipe_id, app, main, dessert)
VALUES
    (1,"Ceviche", "Tacos", "Flan"),
    (2,"Tomato Soup", "Souffle", "Creme Brulee"),
    (3,"Chips","Grilled Cheese","Cheesecake");

CREATE TABLE
  takaakiyayoi_catalog.lineagedemo.dinner
AS SELECT
  recipe_id, concat(app," + ", main," + ",dessert)
AS
  full_menu
FROM
  takaakiyayoi_catalog.lineagedemo.menu
```

できました。
![Screenshot 2024-02-28 at 18.32.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ef6bf44b-fab7-234e-1c62-e00a47049f2f.png)

テーブルの**依存関係**にアクセスするとリネージを確認できます。依存関係が`Upstream`になっているので、`takaakiyayoi_catalog.lineagedemo.dinner`の上流に`takaakiyayoi_catalog.lineagedemo.menu`が存在することがわかります。つまり、menuからdinnerが作られたわけです。
![Screenshot 2024-02-28 at 18.34.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/770adb17-1aef-c410-fb70-afaf4c8f7011.png)

さらに**リネージグラフを表示**をクリックします。グラフィカルな形でリネージを確認できます。
![Screenshot 2024-02-28 at 18.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/59f6e7bd-62c1-7bce-6f04-90e76ede2e21.png)

ここで注目は左上のドロップダウンメニューです。これまでは90日分のリネージしか保持されなかったのですが、範囲が拡張されています。過去一年までキャプチャされます。これは嬉しい。
![Screenshot 2024-02-28 at 18.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ad4440ce-269a-895a-2c23-8ae59f15839b.png)

さらに、リネージはテーブル間のものだけではなく、カラムレベルでも追跡されます。特定のカラムをクリックするとカラムのリネージが表示されます。
![Screenshot 2024-02-28 at 18.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/07a7af81-a0a7-6809-9896-2fe345db7eb3.png)

また、テーブルをクリックするとさらに詳細を確認できます。
![Screenshot 2024-02-28 at 18.37.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/bad031ab-3928-dc5b-c6d3-df1de6acae2b.png)

そして、リネージのキャプチャは言語を問いません。Pythonでも同様です。以下のコマンドでは連番を保持する`recipe_id`と適当な数値を価格`price`として保持する`price`テーブルを作成し、`dinner`テーブルと`recipe_id`で結合を行い`dinner_price`というテーブルを作成しています。

```py:Python
%python
from pyspark.sql.functions import rand, round
df = spark.range(3).withColumn("price", round(10*rand(seed=42),2)).withColumnRenamed("id","recipe_id")

# priceテーブルの保存
df.write.mode("overwrite").saveAsTable("takaakiyayoi_catalog.lineagedemo.price")

dinner = spark.read.table("takaakiyayoi_catalog.lineagedemo.dinner")
price = spark.read.table("takaakiyayoi_catalog.lineagedemo.price")

# dinnerとpriceをrecipe_idでjoinしてdinner_priceテーブルとして保存
dinner_price = dinner.join(price, on="recipe_id")
dinner_price.write.mode("overwrite").saveAsTable("takaakiyayoi_catalog.lineagedemo.dinner_price")
```

`dinner_price`テーブルができました。
![Screenshot 2024-02-28 at 18.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e1a27628-6878-d966-ea62-f9d61ccff58d.png)

リネージグラフも更新されます。
![Screenshot 2024-02-28 at 18.46.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/fff4d0b0-cda6-417f-c363-9090f3ca5afb.png)

これまでは「このテーブルどういう風に作られたのかわからないから、データベース管理者に聞きに行かないと」となっていたのかもしれませんが、リネージ機能を使えばそのような手間は不要ですぐに分析に着手できます。是非ご活用ください。

### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)