claude-skills/

Anthropic公式スキル・プラグインの日本語ディレクトリ

last sync 22h ago
スキルOfficialdevelopment

🔄aidp-migrate-catalog

説明

Databricks Unity Catalog / HMS のスキーマとテーブルを AIDP へ移行します。 抽出 → 書き換え → リプレイの 2 段階パイプラインです。 リライターは以下の 18 件の DDL ルールを適用します: - 3 パート構成 → 2 パート構成へのフラット化 - `s3://` → `oci://`(バケットマップ経由)への変換 - ソースフォーマットの保持(Delta は Delta のまま)および `delta.*` プロパティの除去 - MV(マテリアライズドビュー)/ ストリーミング定義の除外 - `CREATE SCHEMA` の `COMMENT` コロン記法の除去 AIDP の「ステートメント単位の破棄」という仕様上の癖を回避するため、 DDL リプレイは単一 WebSocket 接続によるバッチ処理で実行されます。 次のような場合に使用: `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.

ユースケース

  • Databricks から AIDP へスキーマを移行するとき
  • S3 から OCI へストレージパスを変換するとき
  • DDL ステートメントをバッチ処理で実行したいとき
  • aidp-migrate-job 実行前にスキーマを準備するとき

本文(日本語訳)

aidp-migrate-catalog — Unity Catalog / HMS → AIDP DDL マイグレーション

ノートブックマイグレーション(Pass-2)はテーブルを読み込みます。 AIDP 上にスキーマとテーブルが事前に存在しない場合、すべての読み込みが失敗します。 このスキルはメタデータ層を移植します。

次のような場合に使用

  • 新しいターゲット環境に対して初めて aidp-migrate-job を実行する
  • ソースの Databricks ワークスペースに新しいスキーマ/テーブルを追加した後。
  • aidp-check-data の実行結果で MISSING エントリが多数報告された後。

2ステージパイプライン

┌─────────────────────────────────┐    ┌─────────────────────────────────┐
│ 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 にバッチ処理 │
└─────────────────────────────────┘    └─────────────────────────────────┘

Stage 1 — Databricks からの抽出

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_HOSThttps://<workspace>.cloud.databricks.com
  • DATABRICKS_TOKEN — ワークスペースおよびカタログ読み取り権限を持つ PAT。

エクストラクターは Unity Catalog の REST API(include_delta_metadata=true を付けた /api/2.1/unity-catalog/tables)を使用し、レート制限に対する指数バックオフを実装しています。 テーブル数によりますが、カタログあたり 1〜5 分程度かかります。

Pack JSON の構造

{
  "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"]
            }
          ]
        }
      ]
    }
  ]
}

Stage 2 — 書き換えと AIDP へのリプレイ

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>

18 の DDL 書き換えルールの概要

詳細は 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.minReaderVersiondelta.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 参照)

バッチ DDL ワークアラウンド(重要)

AIDP の Spark WS execute には特有の挙動があります。ステートメント間でセッションが閉じると、per-statement の DDL が破棄されてしまいます。 ワークアラウンドとして、すべての CREATE SCHEMACREATE 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) カラムの型が期待どおりであることを確認できます。

このスキルがマイグレーションしないもの

  • 行レベルのデータ。 このスキルはメタデータのみが対象です。AIDP にデータ行を取り込むには、別途コピー処理(外部ロケーションからの CTAS、または oci os copy)を使用してください。
  • パーミッション/グラント。 UC のグラントは AIDP のパーミッションモデルにマッピングされません。手動で再設定してください。
  • ストアドプロシージャ/ユーザー定義関数。 UC 関数や SQL UDF は別途移植が必要です。
  • ビュー。 シンプルなビューは同じ書き換えツールで対応可能です。クロスカタログ参照を含む複雑なビューは手動でのレビューが必要です。
  • マテリアライズドビュー/ストリーミングテーブル。 書き換えツールが拒否し、出力にフラグを立てます。人手による再実装が必要です。

次のステップ

  • バケットマップでカバーされていない s3:// ロケーションを持つテーブルが残っている場合は aidp-bucket-mapping を実行。
  • すべて正常に反映されたかを確認するため aidp-check-data を実行。
  • その後、ノートブック層のマイグレーションとして aidp-migrate-job を実行。
原文(English)を表示

aidp-migrate-catalog — Unity Catalog / HMS → AIDP DDL migration

The 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.

When to use

  • BEFORE aidp-migrate-job for the first time on a new target environment.
  • After the user adds new schemas/tables to the source Databricks workspace.
  • After a aidp-check-data run reports many MISSING entries.

Two-stage pipeline

┌─────────────────────────────────┐    ┌─────────────────────────────────┐
│ 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            │
└─────────────────────────────────┘    └─────────────────────────────────┘

Stage 1 — extract from Databricks

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_HOSThttps://<workspace>.cloud.databricks.com
  • DATABRICKS_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.

Pack JSON shape

{
  "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"]
            }
          ]
        }
      ]
    }
  ]
}

Stage 2 — rewrite + replay on AIDP

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>.

What the 18 DDL rewrite rules do

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)

The batched-DDL workaround (important)

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.

Verify after running

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.

What this skill does NOT migrate

  • Row-level data. This is metadata only. To get rows into AIDP, use a separate copy (CTAS from external location, or oci os copy).
  • Permissions / grants. UC grants don't map to AIDP's permission model. Re-apply manually.
  • Stored procedures / user-defined functions. UC functions / SQL UDFs need separate porting.
  • Views. Simple views work via the same rewriter. Complex views with cross-catalog refs need manual review.
  • Materialized views / streaming tables. Rejected by the rewriter — flagged in the output for human re-implementation.

After this

原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。