Databricks Unity Catalog(データ管理の統一基盤)またはHMS(ハイブメタストア)のスキーマとテーブルをAIDPへ移行します。抽出→書き換え→再実行という2段階のパイプライン(処理の流れ)で行われます。 書き換え処理では、以下の18個のDDL規則(データベース定義言語の書き換え規則)が適用されます: - 3階層の名前を2階層に統一 - ストレージパス(s3:// → oci://)をバケットマップで変換 - ファイル形式を保持(Deltaはそのままdelta形式)。delta.*プロパティは削除 - マテリアライズドビュー(事前計算したビュー)とストリーミング処理は不可 - スキーマ作成時のコメント部の不要な文字を削除 複数のDDL文をまとめて1つのWebSocket接続で実行することで、AIDPの「実行文ごとに結果が破棄される」という動作を回避しています。 **次のような場合に使用:** aidp-migrate-jobの前に実行してください。スキーマが存在している必要があり、その後でノートブック内でスキーマが読み込まれます。
Migrate Databricks Unity Catalog / HMS schemas + tables onto AIDP. Two-stage extract→rewrite→replay pipeline. The rewriter applies 18 DDL rules (3-part→2-part flatten, s3://→oci:// via bucket-map, source-format preserved (Delta stays Delta) with delta.* property scrub, MV/streaming rejection, CREATE SCHEMA COMMENT-colon strip). Batched single-WebSocket DDL replay works around AIDP's per-statement-discard quirk. Use BEFORE aidp-migrate-job — schemas must exist before notebook reads.
aidp-migrate-catalog — Unity Catalog / HMS → AIDP DDL マイグレーションノートブックマイグレーション(Pass-2)はテーブルを読み込みます。 AIDP 上にスキーマとテーブルが事前に存在しない場合、すべての読み込みが失敗します。 このスキルはメタデータ層を移植します。
aidp-migrate-job を実行する前。aidp-check-data の実行結果で MISSING エントリが多数報告された後。┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Stage 1: extract_catalog_ │ │ Stage 2: migrate_catalog.py │
│ databricks.py │ → │ catalog_pack.json を読み込み、 │
│ Unity Catalog API に REST 呼出 │ │ 18 の DDL 書き換えルールを適用、│
│ reports/catalog_pack.json │ │ AIDP クラスターへ │
│ │ │ 1 回の WS execute にバッチ処理 │
└─────────────────────────────────┘ └─────────────────────────────────┘
python3 ${CLAUDE_PLUGIN_ROOT}/engine/scripts/extract_catalog_databricks.py \
--catalogs "<catalog_a>,<catalog_b>" \
--schemas-only "<catalog_a>:<schema_1>,<catalog_a>:<schema_2>" \
--out reports/catalog_pack.json
| フラグ | 用途 |
|---|---|
--catalogs |
抽出するカタログ名をカンマ区切りで指定。ソース側のカタログ名(例: マイグレーション元の Unity Catalog 名)を使用してください。 |
--schemas-only |
オプションのフィルター — 指定したスキーマのみを抽出します。形式: <catalog>:<schema>,<catalog>:<schema>。省略すると、各カタログのすべてのスキーマが抽出されます。 |
--out |
出力 JSON のパス。次のステージがこのファイルを読み込みます。 |
必要な環境変数:
DATABRICKS_HOST — https://<workspace>.cloud.databricks.comDATABRICKS_TOKEN — ワークスペースおよびカタログ読み取り権限を持つ PAT。エクストラクターは Unity Catalog の REST API(include_delta_metadata=true を付けた /api/2.1/unity-catalog/tables)を使用し、レート制限に対する指数バックオフを実装しています。
テーブル数によりますが、カタログあたり 1〜5 分程度かかります。
{
"catalogs": [
{
"name": "<source_catalog>",
"schemas": [
{
"name": "<schema>",
"tables": [
{
"name": "<table>",
"table_type": "MANAGED",
"data_source_format": "DELTA",
"storage_location": "s3://<bucket>/<path>",
"columns": [{"name": "id", "type_text": "long", "nullable": true}, ...],
"properties": {"delta.minReaderVersion": "2", ...},
"comment": null,
"partition_columns": ["date"]
}
]
}
]
}
]
}
python3 ${CLAUDE_PLUGIN_ROOT}/engine/scripts/migrate_catalog.py \
--pack reports/catalog_pack.json \
--cluster <CLUSTER_ID> \
--aidp-base <AIDP_BASE> \
--datalake-ocid <DATALAKE_OCID> \
--workspace-id <WORKSPACE_UUID> \
--output-base <output-workspace-path> \
--oci-profile <profile>
主要なフラグ:
| フラグ | 用途 |
|---|---|
--dry-run |
書き換え後の DDL を表示するのみで、実行はしません。初回は必ずこのオプションで内容を確認してください。 |
--chunk-size N |
WS execute バッチあたりのステートメント数(デフォルト: 25)。タイムアウトが発生する場合は小さくしてください。 |
--catalogs <list> |
pack 内の指定したカタログのみをマイグレーションします。 |
--schemas <list> |
指定したスキーマのみをマイグレーションします。形式: <catalog>:<schema>。 |
詳細は references/ddl-rewrite-rules.md を参照してください。簡単なまとめ:
| ルール | 入力 → 出力 |
|---|---|
| 3パート名のフラット化 | <src_cat>.<schema>.<table> → <schema>.<table>(AIDP はシングルカタログ default がデフォルト) |
s3:// → oci:// 書き換え |
s3://<bucket>/<path> → oci://<bucket>@<namespace>/<path>(バケットマップ経由) |
| ソースフォーマットの保持 | デフォルトの --target-using は None → Delta は Delta のまま維持。AIDP は Delta をネイティブサポート。意図的に変換する場合は --target-using parquet を指定。 |
delta.* プロパティの除去 |
delta.minReaderVersion、delta.minWriterVersion 等をすべて削除 |
spark.sql.* プロパティの除去 |
クラスターレベルの予約済み設定のため、DDL 内では設定不可 |
pipelines.* プロパティの除去 |
DLT 固有のため、非対象 |
view.query.* プロパティの除去 |
UC 固有のビュープロパティ |
unity.* プロパティの除去 |
UC 固有 |
| マテリアライズドビューの拒否 | MATERIALIZED VIEW は AIDP 非対応 — DDL をスキップしてフラグを立てる |
| ストリーミングテーブルの拒否 | STREAMING TABLE は非対応 — DDL をスキップしてフラグを立てる |
外部テーブルの LOCATION 書き換え |
同様の s3://→oci:// バケットマップで書き換え |
CREATE SCHEMA … COMMENT '<text>' のコロン除去 |
COMMENT にコロン(:)が含まれると AIDP がスキーマを黙って削除してしまうため、COMMENT 句ごと除去 |
| 他(全リストは references 参照) |
AIDP の Spark WS execute には特有の挙動があります。ステートメント間でセッションが閉じると、per-statement の DDL が破棄されてしまいます。
ワークアラウンドとして、すべての CREATE SCHEMA と CREATE TABLE(依存関係順)を 1 回の WS execute 呼び出しにまとめてバッチ処理します。
migrate_catalog.py はこれを --chunk-size を使って自動的に行います。
ただし、チャンク内の 1 つのステートメントが失敗した場合、チャンク全体のステータスが成功と報告されることがあり、実際には一部のテーブルが作成されていない可能性があります。 そのため、マイグレーターは実行後にすべてのステートメントについて存在確認を行い、ステートメントごとの結果を報告します。
マイグレーション後、スキーマとテーブルが正常に作成されたかを aidp-check-data で確認してください。
具体的には以下を実行します:
spark.sql("SHOW SCHEMAS IN default").show(100, False)
spark.sql("SHOW TABLES IN default.<schema>").show(100, False)
spark.sql("DESCRIBE TABLE default.<schema>.<table>").show(100, False)
DESCRIBE TABLE により、(a) テーブルが存在すること、(b) カラムの型が期待どおりであることを確認できます。
oci os copy)を使用してください。s3:// ロケーションを持つテーブルが残っている場合は aidp-bucket-mapping を実行。aidp-check-data を実行。aidp-migrate-job を実行。aidp-migrate-catalog — Unity Catalog / HMS → AIDP DDL migrationThe notebook migration (Pass-2) reads tables. If the schemas + tables don't exist on AIDP first, every read fails. This skill ports the metadata layer.
aidp-migrate-job for the first time on a new target environment.aidp-check-data run reports many MISSING entries.┌─────────────────────────────────┐ ┌─────────────────────────────────┐
│ Stage 1: extract_catalog_ │ │ Stage 2: migrate_catalog.py │
│ databricks.py │ → │ reads catalog_pack.json, │
│ REST against Unity Catalog API │ │ applies 18 DDL rewrite rules, │
│ reports/catalog_pack.json │ │ batches into ONE WS execute │
│ │ │ on the AIDP cluster │
└─────────────────────────────────┘ └─────────────────────────────────┘
python3 ${CLAUDE_PLUGIN_ROOT}/engine/scripts/extract_catalog_databricks.py \
--catalogs "<catalog_a>,<catalog_b>" \
--schemas-only "<catalog_a>:<schema_1>,<catalog_a>:<schema_2>" \
--out reports/catalog_pack.json
| Flag | Purpose |
|---|---|
--catalogs |
Comma-separated catalog names to extract. Use the source catalog names (e.g. the Unity Catalog you migrate from). |
--schemas-only |
Optional filter — only extract these specific schemas. Format: <catalog>:<schema>,<catalog>:<schema>. Without it, ALL schemas in each catalog are extracted. |
--out |
Output JSON path. The next stage reads this. |
Env required:
DATABRICKS_HOST — https://<workspace>.cloud.databricks.comDATABRICKS_TOKEN — PAT with workspace + catalog read.The extractor uses Unity Catalog's REST API (/api/2.1/unity-catalog/tables with include_delta_metadata=true) and includes exponential backoff for rate limits. Expect 1-5 min per catalog depending on table count.
{
"catalogs": [
{
"name": "<source_catalog>",
"schemas": [
{
"name": "<schema>",
"tables": [
{
"name": "<table>",
"table_type": "MANAGED",
"data_source_format": "DELTA",
"storage_location": "s3://<bucket>/<path>",
"columns": [{"name": "id", "type_text": "long", "nullable": true}, ...],
"properties": {"delta.minReaderVersion": "2", ...},
"comment": null,
"partition_columns": ["date"]
}
]
}
]
}
]
}
python3 ${CLAUDE_PLUGIN_ROOT}/engine/scripts/migrate_catalog.py \
--pack reports/catalog_pack.json \
--cluster <CLUSTER_ID> \
--aidp-base <AIDP_BASE> \
--datalake-ocid <DATALAKE_OCID> \
--workspace-id <WORKSPACE_UUID> \
--output-base <output-workspace-path> \
--oci-profile <profile>
Useful flags:
| Flag | Purpose |
|---|---|
--dry-run |
Print the rewritten DDL but do NOT execute. Use first time to inspect. |
--chunk-size N |
Statements per WS execute batch (default 25). Reduce if you hit timeout. |
--catalogs <list> |
Migrate only these catalogs from the pack. |
--schemas <list> |
Migrate only these schemas. Format <catalog>:<schema>. |
Full details in references/ddl-rewrite-rules.md. Quick summary:
| Rule | Input → Output |
|---|---|
| 3-part name flatten | <src_cat>.<schema>.<table> → <schema>.<table> (AIDP defaults to single-catalog default) |
s3:// → oci:// rewrite |
s3://<bucket>/<path> → oci://<bucket>@<namespace>/<path> via bucket-map |
| Source format preserved | Default --target-using is None → Delta stays Delta. AIDP supports Delta natively. Pass --target-using parquet to deliberately convert. |
delta.* property strip |
All delta.minReaderVersion, delta.minWriterVersion, etc. dropped |
spark.sql.* property strip |
Reserved cluster-level configs, can't be set in DDL |
pipelines.* property strip |
DLT-specific, not applicable |
view.query.* property strip |
UC-specific view properties |
unity.* property strip |
UC-specific |
| MV rejection | MATERIALIZED VIEW not supported on AIDP — DDL skipped + flagged |
| Streaming table rejection | STREAMING TABLE not supported — DDL skipped + flagged |
External-table LOCATION rewrite |
Rewritten via the same s3://→oci:// bucket-map |
CREATE SCHEMA … COMMENT '<text>' colon strip |
AIDP silently nukes a schema if its COMMENT contains a : — strip the COMMENT clause entirely. |
| etc. (full list in references) |
AIDP's Spark WS execute has a quirk: per-statement DDL is discarded if the session closes between statements. Workaround: batch all CREATE SCHEMA + CREATE TABLE (in dependency order) into ONE WS execute call. migrate_catalog.py does this automatically via --chunk-size.
This means if a single statement in a chunk fails, the WHOLE chunk's reported status may say success even though some tables aren't created. The migrator therefore probes existence post-execute for every statement and reports per-statement results.
After the migration, verify schemas + tables actually landed via aidp-check-data. Specifically:
spark.sql("SHOW SCHEMAS IN default").show(100, False)
spark.sql("SHOW TABLES IN default.<schema>").show(100, False)
spark.sql("DESCRIBE TABLE default.<schema>.<table>").show(100, False)
DESCRIBE TABLE confirms (a) the table exists and (b) the column types are what you expect.
oci os copy).aidp-bucket-mapping if any tables still have s3:// locations the bucket-map didn't cover.aidp-check-data to verify everything landed.aidp-migrate-job for the notebook layer.原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。