DatabricksのDelta Live Tablesでカタログやスキーマを複数指定できるようになりました！

リリース当初から要望されていた機能です。

https://docs.databricks.com/ja/release-notes/product/2025/january.html#delta-live-tables-now-supports-publishing-to-tables-in-multiple-schemas-and-catalogs

> **Delta Live Tablesは、複数のスキーマおよびカタログへのテーブルの公開をサポートするようになりました**
>
> デフォルトでは、Delta Live Tablesで作成された新しいパイプラインは、複数のカタログおよびスキーマでマテリアライズドビューおよびストリーミングテーブルの作成と更新をサポートします。
> 
> パイプライン構成の新しいデフォルト動作では、ユーザーがパイプラインのデフォルトスキーマとなるターゲットスキーマを指定する必要があります。LIVE仮想スキーマおよび関連する構文は不要になりました。詳細については、以下を参照してください:
> - [ターゲットカタログとスキーマを設定する](https://docs.databricks.com/ja/delta-live-tables/target-schema.html)
> - [Delta Live Tablesパイプラインを構成する](https://docs.databricks.com/ja/release-notes/product/2025/january.html#delta-live-tables-now-supports-publishing-to-tables-in-multiple-schemas-and-catalogs:~:text=Configure%20a%20Delta%20Live%20Tables%20pipeline)
> - [LIVEスキーマ（レガシー）](https://docs.databricks.com/ja/delta-live-tables/live-schema.html)

従来は、一つのDelta Live Tables(DLT)パイプラインでは一つのカタログとスキーマしか指定ができませんでした。このため、「このマテリアライズドビューはスキーマ`dlt1`、こちらはスキーマ`dlt2`...」というように出力先を分けることができませんでした。

今回のこちらの機能のパブリックプレビューによって、パイプラインに含まれるそれぞれのマテリアライズドビューやストリーミングテーブルを任意のカタログ、スキーマに公開できるようになりました。これによって、パイプラインの出力を任意に設定できる柔軟性を提供します。また、コストを削減するために、複数のロジックと出力先を持つパイプラインを一つのパイプラインにまとめることも可能となります。

注意点としては、**この機能は新規に作成するDLTパイプラインに適用される**ということです。既存のパイプラインには適用されません。

# ウォークスルー

早速、サンプルパイプラインを使ってウォークスルーします。Delta Live Tablesの画面からサンプルパイプラインを作成します。

![Screenshot 2025-02-11 at 19.45.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/900422d3-b7bc-aa85-e013-0507ae491e96.png)

作成画面に**DPMが有効になっています**と表示されています。これは**Direct Publishing Mode**の略です。わかりにくくてすみません。新規パイプラインではこちらのモードがデフォルトでオンになります。

![Screenshot 2025-02-11 at 19.32.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/af796479-c71f-885b-71b8-ccd37dd38e90.png)

DPMモードでもデフォルトのカタログとスキーマの指定は必要です。これはパイプラインのロジックで明示的にカタログやスキーマが設定されていない場合に用いられます。

![Screenshot 2025-02-11 at 19.32.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/678c5524-0143-0d62-4b9a-2b796689fc44.png)

パイプラインを作成すると、ロジックを定義するノートブックが表示されます。このままではDPMの恩恵を受けられないので、以下のように修正します。作成されるストリーミングテーブルとマテリアライズドビューをそれぞれ異なるスキーマに出力します。主な変更点は2点です。

1. ストリーミングテーブルとマテリアライズドビューの発行先や[`live`スキーマ](https://docs.databricks.com/ja/delta-live-tables/live-schema.html)による参照を[明示的に3レベルの名前空間(カタログ、スキーマ、テーブル)](https://docs.databricks.com/ja/delta-live-tables/target-schema.html#target-a-dataset-in-a-different-catalog-or-schema)で指定。
1. `LIVE TABLE`を`MATERIARIZED VIEW`に変更

## taxi_raw_records

**変更前**

```sql
CREATE
OR REFRESH STREAMING TABLE taxi_raw_records (
  CONSTRAINT valid_distance EXPECT (trip_distance > 0.0) ON VIOLATION DROP ROW
) AS
SELECT
  *
FROM
  STREAM(samples.nyctaxi.trips)
```

**変更後**

`takaakiyayoi_catalog.dlt1`に発行します。

```sql
CREATE
OR REFRESH STREAMING TABLE takaakiyayoi_catalog.dlt1.taxi_raw_records (
  CONSTRAINT valid_distance EXPECT (trip_distance > 0.0) ON VIOLATION DROP ROW
) AS
SELECT
  *
FROM
  STREAM(samples.nyctaxi.trips)
```

## total_fare_amount_by_week

**変更前**

```sql
CREATE
OR REFRESH LIVE TABLE total_fare_amount_by_week AS
SELECT
  date_trunc("week", tpep_pickup_datetime) as week,
  SUM(fare_amount) as total_amount
FROM
  live.taxi_raw_records
GROUP BY
  week
```

**変更後**

`takaakiyayoi_catalog.dlt2`に発行します。

```sql
CREATE
OR REFRESH MATERIALIZED VIEW takaakiyayoi_catalog.dlt2.total_fare_amount_by_week AS
SELECT
  date_trunc("week", tpep_pickup_datetime) as week,
  SUM(fare_amount) as total_amount
FROM
  takaakiyayoi_catalog.dlt1.taxi_raw_records
GROUP BY
  week
```

## max_distance_by_week

**変更前**

```sql
CREATE
OR REFRESH LIVE TABLE max_distance_by_week AS
SELECT
  date_trunc("week", tpep_pickup_datetime) as week,
  MAX(trip_distance) as max_distance
FROM
  live.taxi_raw_records
GROUP BY
  week
```

**変更後**

`takaakiyayoi_catalog.dlt3`に発行します。

```sql
CREATE
OR REFRESH MATERIALIZED VIEW takaakiyayoi_catalog.dlt3.max_distance_by_week AS
SELECT
  date_trunc("week", tpep_pickup_datetime) as week,
  MAX(trip_distance) as max_distance
FROM
  takaakiyayoi_catalog.dlt1.taxi_raw_records
GROUP BY
  week
```

この時点で検証を行うと、問題なくパイプラインが構築されています。

![Screenshot 2025-02-11 at 19.34.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/73000806-48a0-168b-2b8a-1d18a9cc7872.png)

## パイプラインの起動

**詳細**や**フロー**タブで公開先を確認することができます。

![Screenshot 2025-02-11 at 19.36.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/f897c1e9-aff1-f325-df1c-a6c2ecda33f0.png)

![Screenshot 2025-02-11 at 19.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71537972-671e-41cc-a637-a6cd7613e37c.png)

![Screenshot 2025-02-11 at 19.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/385f1c9b-ab9a-ce45-7dea-a387d98aef40.png)

## 結果の確認

カタログエクスプローラで、それぞれのスキーマ配下にストリーミングテーブルやマテリアライズドビューが発行されていることを確認できます。

![Screenshot 2025-02-11 at 19.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/09785ce5-2071-7423-fbc3-df4b0508977d.png)

![Screenshot 2025-02-11 at 19.37.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3dece625-81d7-5e68-e5dc-39b78f4db56e.png)

![Screenshot 2025-02-11 at 19.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/00164c3d-5b57-532c-2a1c-e697931e8a70.png)


是非、ご活用ください！

### はじめてのDatabricks

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

### Databricks無料トライアル

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