AIDP レイクハウス(データ統合管理基盤)上での書き込み側 Spark SQL — テーブル・ビュー・スキーマの作成・変更・削除(DDL)、行の挿入・更新・削除・マージ、Delta テーブルのメンテナンス(最適化、不要データ削除、過去バージョン参照、復元、スキーマ進化、クラスタリング改善)に対応します。 **次のような場合に使用:** - テーブルやビューを作成・変更・削除したい - 行データを挿入・更新・削除・マージしたい - Delta テーブルを最適化・整理したい - 過去の特定時点のデータを照会したい - スキーマを変更したい - SELECT 以外の SQL を実行したい 読み取り専用の分析には aidp-analyzing-data、テーブル管理の制御操作(コマンドライン/API)には aidp-table-management をご利用ください。
Write-side Spark SQL on the AIDP lakehouse — DDL (CREATE/ALTER/DROP table·view·schema), DML (INSERT/UPDATE/DELETE/MERGE upsert), and Delta maintenance (OPTIMIZE, VACUUM, time travel, RESTORE, schema evolution, liquid clustering). Use when the user wants to create/alter/drop a table or view, insert/update/delete/merge rows, upsert, compact/optimize/vacuum a Delta table, query an old version (time travel), restore, evolve a schema, or run any non-SELECT SQL. For read-only analytics use aidp-analyzing-data; for control-plane (CLI/REST) table lifecycle use aidp-table-management.
aidp-sql-ddl — レイクハウス書き込み SQL(DDL / DML / Delta メンテナンス)AIDP は Spark 3.5 + Delta Lake 3.2(platform-ref §39)で動作するため、
同梱の scripts/aidp_sql.py ヘルパーを通じて完全な書き込み文法が利用できます。
これは aidp-analyzing-data が SELECT に使用しているのと同じエンジンです。
本スキルはデータまたはスキーマを変更するすべての操作を対象とします。
AIDP 2026-06-10 にて動作確認済み(USER クラスター、aidp_sql.py 経由、すべてアンラップ済み → status: ok):
CREATE TABLE、INSERT、UPDATE、DELETE、MERGE、OPTIMIZE、VACUUM、
DESCRIBE HISTORY、タイムトラベル(VERSION AS OF)、DROP —
Spark 3.5 / Delta 3.2 の書き込み文法(platform-ref §39)がエンドツーエンドで実行可能です。
(テスター1名が、全く新しいインスタンスで最初の素の CREATE TABLE を実行した際に
一時的なカタログ登録エラーが発生したと報告しましたが、新規インスタンスでは再現されませんでした。
詳細は後述の「注意事項」を参照してください。)
以下には使用しないこと:
aidp-analyzing-data を使用aidp-table-management を使用ここに記載されたすべてのステートメントは状態を変更します。 DML / DDL を実行する前に、以下の手順を必ず実施してください:
aidp-cluster-ops)、
オブジェクトを完全修飾名で指定する(catalog.schema.table)。DROP、DELETE、TRUNCATE、INSERT OVERWRITE、VACUUM に注意
(VACUUM は古いファイルを永続的に削除するため、タイムトラベルが使用不能になります)。.aidp/payloads/ に保存する。UPDATE / DELETE の前に SELECT count(*) … WHERE <predicate> で対象件数を確認する。python "$PLUGIN_DIR/scripts/aidp_sql.py" \
--region <region> --datalake <DATALAKE_OCID> --workspace <ws> --cluster <cluster-key> \
--code "spark.sql('''<SQL>''')"
返却される JSON: {status, execution_count, outputs, spark_job_ids, error}
MCP 不要 / AIDP_SESSION 不要。
| 操作 | SQL |
|---|---|
| マネージド Delta テーブルの作成 | CREATE TABLE c.s.t (id INT, v STRING) USING DELTA |
| CTAS | CREATE TABLE c.s.t USING DELTA AS SELECT … |
| リキッドクラスタリング | CREATE TABLE … CLUSTER BY (col)(または ALTER TABLE … CLUSTER BY) |
| 挿入 | INSERT INTO c.s.t VALUES (…) · 全件再ロード: INSERT OVERWRITE c.s.t SELECT … |
| 更新 / 削除 | UPDATE c.s.t SET v='x' WHERE … · DELETE FROM c.s.t WHERE … |
| Upsert(MERGE) | MERGE INTO c.s.t t USING src s ON t.id=s.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT * |
| スキーマ変更 | ALTER TABLE c.s.t ADD COLUMNS (x INT) · … RENAME COLUMN · … DROP COLUMN; または mergeSchema オプション付き書き込み |
| ファイル圧縮 | OPTIMIZE c.s.t [ZORDER BY (col)] |
| ファイル回収 | VACUUM c.s.t RETAIN 168 HOURS ※破壊的操作 — 要確認。168時間未満にするには spark.databricks.delta.retentionDurationCheck.enabled=false が必要 |
| 履歴確認 | DESCRIBE HISTORY c.s.t |
| タイムトラベル | SELECT * FROM c.s.t VERSION AS OF 3 · … TIMESTAMP AS OF '2026-06-01' |
| リストア | RESTORE TABLE c.s.t TO VERSION AS OF 3 |
| ビュー | CREATE VIEW c.s.v AS SELECT … · CREATE OR REPLACE VIEW … · DROP VIEW … |
| スキーマ(名前空間) | CREATE SCHEMA IF NOT EXISTS c.s · DROP SCHEMA c.s [CASCADE] |
CREATE TABLE で発生した一時的エラーの報告(再現不可)あるテスターが、プロビジョニングしたばかりの DataLake で最初の素の
CREATE TABLE … USING DELTA を実行した際に、
ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
(カタログ登録のレースコンディションと推測され、SQL エラーではない)が発生したと報告しました。
このエラーは再現できませんでした。
実際に新たにプロビジョニングした DataLake + クラスターでは、
初回の素の CREATE TABLE が正常に成功しました
(2026-06-12 に新規インスタンスで確認済み — テーブル作成後、SHOW TABLES で確認。
既存インスタンスでも問題なし)。
したがって、これはプロビジョニング直後のごく短い時間帯にのみ発生しうる 一時的な現象として扱ってください。決定的な挙動ではありません。
万が一このエラーに遭遇した場合は、DDL を繰り返し叩かないでください。
代わりにライター(spark.createDataFrame(rows).write.saveAsTable('c.s.t'))または
aidp-ingest-file-to-table(ingest → CTAS)でカタログをウォームアップしてから、
素の CREATE TABLE を実行してください。
.aidp/catalog.md または DESCRIBE / SHOW COLUMNS で必ず確認する。error フィールドを読み、カタログを根拠に修正してから
1回だけリトライする — 繰り返し推測しない。aidp-pipelines と組み合わせること)。oci:// 上の Delta テーブルに対する他ソースからの読み書きは、
…-spark-connectors plugin(aidp-iceberg、aidp-object-storage)に委譲してください。
本スキルはレイクハウスネイティブな SQL 専用です。aidp-sql-ddl — lakehouse write SQL (DDL / DML / Delta maintenance)AIDP runs Spark 3.5 + Delta Lake 3.2 (platform-ref §39), so the full write grammar works through the
bundled scripts/aidp_sql.py helper — the same engine aidp-analyzing-data uses for SELECT. This skill
covers everything that changes data or schema. Live-verified on AIDP 2026-06-10 (USER cluster, via
aidp_sql.py, all un-wrapped → status: ok): CREATE TABLE, INSERT, UPDATE, DELETE, MERGE,
OPTIMIZE, VACUUM, DESCRIBE HISTORY, time travel (VERSION AS OF), DROP — the full Spark 3.5 / Delta
3.2 write grammar (platform-ref §39) executes end-to-end. (A tester once saw the first bare CREATE TABLE on a
brand-new instance throw a transient catalog-registration error; it was not reproducible on a fresh
instance — see Caveat below.)
aidp-analyzing-data. NOT for control-plane catalog/connection registration
→ aidp-table-management.Every statement here changes state. Before running any DML/DDL:
aidp-cluster-ops) and qualify objects fully (catalog.schema.table).DROP, DELETE,
TRUNCATE, INSERT OVERWRITE, VACUUM (VACUUM permanently removes old files → breaks time travel)..aidp/payloads/ per references/payloads.md.SELECT count(*) … WHERE <predicate> before the matching UPDATE/DELETE.python "$PLUGIN_DIR/scripts/aidp_sql.py" \
--region <region> --datalake <DATALAKE_OCID> --workspace <ws> --cluster <cluster-key> \
--code "spark.sql('''<SQL>''')"
Returns JSON {status, execution_count, outputs, spark_job_ids, error}. No MCP / no AIDP_SESSION needed.
| Need | SQL |
|---|---|
| Create managed Delta table | CREATE TABLE c.s.t (id INT, v STRING) USING DELTA |
| CTAS | CREATE TABLE c.s.t USING DELTA AS SELECT … |
| Liquid clustering | CREATE TABLE … CLUSTER BY (col) (or ALTER TABLE … CLUSTER BY) |
| Insert | INSERT INTO c.s.t VALUES (…) · full reload INSERT OVERWRITE c.s.t SELECT … |
| Update / Delete | UPDATE c.s.t SET v='x' WHERE … · DELETE FROM c.s.t WHERE … |
| Upsert (MERGE) | MERGE INTO c.s.t t USING src s ON t.id=s.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT * |
| Schema evolution | ALTER TABLE c.s.t ADD COLUMNS (x INT) · … RENAME COLUMN · … DROP COLUMN; or write with mergeSchema |
| Compact | OPTIMIZE c.s.t [ZORDER BY (col)] |
| Reclaim files | VACUUM c.s.t RETAIN 168 HOURS (destructive — confirm; <168h needs spark.databricks.delta.retentionDurationCheck.enabled=false) |
| History | DESCRIBE HISTORY c.s.t |
| Time travel | SELECT * FROM c.s.t VERSION AS OF 3 · … TIMESTAMP AS OF '2026-06-01' |
| Restore | RESTORE TABLE c.s.t TO VERSION AS OF 3 |
| View | CREATE VIEW c.s.v AS SELECT … · CREATE OR REPLACE VIEW … · DROP VIEW … |
| Schema (namespace) | CREATE SCHEMA IF NOT EXISTS c.s · DROP SCHEMA c.s [CASCADE] |
CREATE TABLE report (NOT reproduced)A tester once reported that the first bare CREATE TABLE … USING DELTA on a just-provisioned DataLake threw
ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 (a suspected catalog-registration race,
not a SQL error). This could NOT be reproduced. On a genuinely freshly-provisioned DataLake + cluster, the
very first bare CREATE TABLE succeeded (live-checked 2026-06-12 on a brand-new instance — table created,
confirmed via SHOW TABLES; also fine on established instances). So treat it as a possible transient in a
narrow post-provision window, not a deterministic behavior. If you ever do hit it, don't hammer the DDL —
create the first table via the writer (spark.createDataFrame(rows).write.saveAsTable('c.s.t')) or
ingest-then-CTAS (aidp-ingest-file-to-table) to warm the catalog, then bare CREATE TABLE works.
.aidp/catalog.md or a DESCRIBE/SHOW COLUMNS cell.error field, fix grounded in the catalog, retry once — don't guess repeatedly.aidp-pipelines).oci:// table reads/writes from other sources → delegate to the
…-spark-connectors plugin (aidp-iceberg, aidp-object-storage); this skill is lakehouse-native SQL.原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。