🗄️aidp-alh
- ソース
- GitHub で見る ↗
説明
AIDPノートブックからOracle AI Lakehouse(ALH)、Autonomous Data Warehouse(ADW)、またはAutonomous Transaction Processing(ATP)に接続します。 ウォレット/パスワード認証および `catalog.id` パス(`ORACLE_ALH` / `ORACLE_ATP`)には、AIDPの `aidataplatform` Spark フォーマットハンドラーを優先して使用してください。 ただし、IAM DBトークン認証の場合は、AIDPコネクターがDBトークン認証をまだサポートしていないため、生のSpark JDBCを使用してください。
原文を表示
Connect from an AIDP notebook to Oracle AI Lakehouse (ALH), Autonomous Data Warehouse (ADW), or Autonomous Transaction Processing (ATP). Prefer the AIDP `aidataplatform` Spark format handler for wallet/password and catalog.id paths (`ORACLE_ALH` / `ORACLE_ATP`), but use raw Spark JDBC for IAM DB-token because the AIDP connector does not support DB-token auth yet.
ユースケース
- ✓Oracle AI Lakehouseに接続するとき
- ✓Autonomous Data Warehouseに接続するとき
- ✓Autonomous Transaction Processingに接続するとき
- ✓ウォレット/パスワード認証で接続するとき
本文(日本語訳)
aidp-alh — AIDP aidataplatform 経由での Oracle AI Lakehouse / ADW / ATP
このスキルは、公式 AIDP インジェストコネクターを使用して Oracle Autonomous Database ファミリー全体 をカバーします。
Oracle AI Lakehouse / ADW スタイルの接続には ORACLE_ALH を、ユーザーが ATP を明示的に指定した場合は ORACLE_ATP を使用してください。
ユーザーが ATP または ADW を具体的に指定した場合は、このスキルをそのまま使用し、環境変数プレフィックス(ATP_* / ADW_*)を ALH_* に読み替えて同様の手順で進めてください。
次のような場合に使用
- AIDP ノートブックから ALH・ADW・ATP テーブルの読み書きを行いたい場合。
- ユーザーが次のキーワードを挙げた場合: 「ALH」「AI Lakehouse」「ADW」「Autonomous Data Warehouse」「ATP」「Autonomous Transaction Processing」「Autonomous Database」「26ai lakehouse」「lakehouse external catalog」
- ウォレットの内容またはパス、TNS エイリアス、DB ユーザー名/パスワード、あるいは既存の AIDP external catalog ID を保持している場合。
次のような場合には使用しない
- ExaCS の場合 →
aidp-exacsを使用。 - Autonomous でない Oracle Database の場合 →
aidp-oracle-dbを使用。
AIDP ノートブックの前提条件
- 組み込みの
aidataplatformSpark フォーマットハンドラーを備えた AIDP クラスター。 - 以下のいずれか:
- Base64 エンコードされたウォレットの内容
- Workspace または Volume パス上のウォレット ZIP
- 既存の external catalog ID
- 生の JDBC 例外パス用の IAM DB トークン要件
- 環境変数 / OCI Vault シークレット:
ALH_WALLET_CONTENTまたはALH_WALLET_PATHALH_TNS、ALH_USER、ALH_PASSWORDALH_SCHEMA、ALH_TABLE- (任意)
ALH_CATALOG_ID
読み込み(インラインコネクターオプション)
import os
from oracle_ai_data_platform_connectors.aidataplatform import (
AIDP_FORMAT, aidataplatform_options,
)
opts = aidataplatform_options(
type=os.environ.get("ALH_CONNECTOR_TYPE", "ORACLE_ALH"), # ATP の場合は ORACLE_ATP を使用
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={
"wallet.content": os.environ["ALH_WALLET_CONTENT"],
"tns": os.environ["ALH_TNS"],
},
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()
wallet.path を使用した読み込み
opts = aidataplatform_options(
type="ORACLE_ALH",
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={
"wallet.path": os.environ["ALH_WALLET_PATH"], # /Workspace/... または /Volumes/...
"tns": os.environ["ALH_TNS"],
},
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
書き込み(インラインコネクターオプション)
opts["table"] = os.environ["ALH_TARGET_TABLE"]
opts["write.mode"] = os.environ.get("ALH_WRITE_MODE", "APPEND") # CREATE | APPEND | OVERWRITE | MERGE
df.write.format(AIDP_FORMAT).options(**opts).save()
既存の external catalog を使用する場合(catalog.id)
catalog_opts = aidataplatform_options(
type="ORACLE_ALH",
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={"catalog.id": os.environ["ALH_CATALOG_ID"]},
)
df = spark.read.format(AIDP_FORMAT).options(**catalog_opts).load()
df.write.format(AIDP_FORMAT).options(
**{
"catalog.id": os.environ["ALH_CATALOG_ID"],
"schema": os.environ["ALH_SCHEMA"],
"table": os.environ["ALH_TARGET_TABLE"],
"write.mode": "APPEND",
}
).save()
External catalog のテーブルアクセスでは、3 パート名も使用できます:
df = spark.table(f"{os.environ['ALH_CATALOG_ID']}.{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TABLE']}")
df.write.mode("append").insertInto(
f"{os.environ['ALH_CATALOG_ID']}.{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TARGET_TABLE']}"
)
プッシュダウン
pushdown_opts = aidataplatform_options(
type="ORACLE_ALH",
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
extra={
"wallet.content": os.environ["ALH_WALLET_CONTENT"],
"tns": os.environ["ALH_TNS"],
"pushdown.sql": "SELECT * FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 10",
},
)
df = spark.read.format(AIDP_FORMAT).options(**pushdown_opts).load()
IAM DB トークン例外(生の Spark JDBC)
AIDP 組み込みの aidataplatform コネクターは、現時点では IAM DB トークン認証をサポートしていません。
ユーザーが DB トークンを明示的に必要とする場合は、ヘルパーパッケージを使用した生の Spark JDBC を使用してください:
import os
from oracle_ai_data_platform_connectors.auth import generate_db_token
from oracle_ai_data_platform_connectors.auth.dbtoken import refresh_on_executors
from oracle_ai_data_platform_connectors.jdbc import (
build_oracle_jdbc_url, spark_jdbc_options_dbtoken,
)
token_dir = generate_db_token(
compartment_ocid=os.environ["ALH_COMPARTMENT_OCID"],
target_dir="/tmp/dbcred_alh",
)
url = build_oracle_jdbc_url(
tns_alias=os.environ["ALH_TNS"],
tns_admin=os.environ["ALH_WALLET_DIR"], # /tmp 以下に展開したウォレットディレクトリ
)
opts = spark_jdbc_options_dbtoken(url=url, token_dir=token_dir)
df = (
spark.read.format("jdbc")
.options(**opts)
.option("dbtable", f"{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TABLE']}")
.load()
)
df.show()
# 長時間ジョブの場合、パーティション処理の前にエグゼキューター上で DB トークンをリフレッシュする。
refresh = refresh_on_executors(spark, os.environ["ALH_COMPARTMENT_OCID"], token_dir)
注意事項
- 接続が AIDP にすでに存在する場合は
catalog.idを優先して使用してください。 ホスト情報・ウォレット・認証情報を生成されたノートブックから切り離すことができます。 - ソース側のフィルタリングには、Oracle SQL のセマンティクスを正確に利用したい場合は
pushdown.sqlを優先してください。 自動プッシュダウンで十分な場合は DataFrame の.select(...).filter(...).limit(...)を使用してください。 - 組み込みコネクターでは
wallet.contentまたはwallet.pathを使用してください。 生の Spark JDBC へのフォールバックを意図する場合を除き、/tmpにウォレットを展開しないでください。 - IAM DB トークンは、
aidataplatformが未対応であるため、意図的に生の JDBC へフォールバックする主なケースです。 ORACLE_ALHとORACLE_ATPは別々のコネクタータイプのリテラルです。 ATP のサンプルをそのまま適用する場合はORACLE_ATPを使用してください。- Instance Principal / Resource Principal は現在 AIDP ノートブックでブロックされています(IMDS に到達不可、RP トークン未提供)。
InstancePrincipalsSecurityTokenSigner()を使用しないでください。
参考資料
- ヘルパー: scripts/oracle_ai_data_platform_connectors/aidataplatform.py
- 公式 ALH サンプル: data-engineering/ingestion/Read_Write_Oracle_Ecosystem_Connectors/Autonomous_AI_Lakehouse.ipynb
- 公式 ATP サンプル: data-engineering/ingestion/Read_Write_Oracle_Ecosystem_Connectors/Autonomous_Transaction_Processing.ipynb
- AIDP ノートブック認証の制限:
Claude context/AIDP/AIDP Context/AIDP/aidp-notebook-authentication.md
原文(English)を表示
aidp-alh — Oracle AI Lakehouse / ADW / ATP via AIDP aidataplatform
This skill covers the entire Oracle Autonomous Database family using the official AIDP ingestion connectors. Use ORACLE_ALH for Oracle AI Lakehouse / ADW-style connections and ORACLE_ATP when the user specifically wants ATP.
If the user names ATP or ADW specifically, just use this skill — substitute the env-var prefix (ATP_* / ADW_*) for ALH_* and proceed identically.
When to use
- User wants to read or write an ALH, ADW, or ATP table from an AIDP notebook.
- User mentions: "ALH", "AI Lakehouse", "ADW", "Autonomous Data Warehouse", "ATP", "Autonomous Transaction Processing", "Autonomous Database", "26ai lakehouse", "lakehouse external catalog".
- User has wallet content/path, a TNS alias, DB username/password, or an existing AIDP external catalog id.
When NOT to use
- For ExaCS → use
aidp-exacs. - For non-Autonomous Oracle Database → use
aidp-oracle-db.
Prerequisites in the AIDP notebook
- AIDP cluster with the built-in
aidataplatformSpark format handler. - One of: base64 wallet content, wallet zip at a Workspace/Volume path, an existing external catalog id, or IAM DB-token requirements for the raw JDBC exception path.
- Env vars / OCI Vault secrets:
ALH_WALLET_CONTENTorALH_WALLET_PATHALH_TNS,ALH_USER,ALH_PASSWORDALH_SCHEMA,ALH_TABLE- optional
ALH_CATALOG_ID
Read (inline connector options)
import os
from oracle_ai_data_platform_connectors.aidataplatform import (
AIDP_FORMAT, aidataplatform_options,
)
opts = aidataplatform_options(
type=os.environ.get("ALH_CONNECTOR_TYPE", "ORACLE_ALH"), # use ORACLE_ATP for ATP
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={
"wallet.content": os.environ["ALH_WALLET_CONTENT"],
"tns": os.environ["ALH_TNS"],
},
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
df.show()
Read using wallet.path
opts = aidataplatform_options(
type="ORACLE_ALH",
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={
"wallet.path": os.environ["ALH_WALLET_PATH"], # /Workspace/... or /Volumes/...
"tns": os.environ["ALH_TNS"],
},
)
df = spark.read.format(AIDP_FORMAT).options(**opts).load()
Write (inline connector options)
opts["table"] = os.environ["ALH_TARGET_TABLE"]
opts["write.mode"] = os.environ.get("ALH_WRITE_MODE", "APPEND") # CREATE | APPEND | OVERWRITE | MERGE
df.write.format(AIDP_FORMAT).options(**opts).save()
Use an existing external catalog (catalog.id)
catalog_opts = aidataplatform_options(
type="ORACLE_ALH",
schema=os.environ["ALH_SCHEMA"],
table=os.environ["ALH_TABLE"],
extra={"catalog.id": os.environ["ALH_CATALOG_ID"]},
)
df = spark.read.format(AIDP_FORMAT).options(**catalog_opts).load()
df.write.format(AIDP_FORMAT).options(
**{
"catalog.id": os.environ["ALH_CATALOG_ID"],
"schema": os.environ["ALH_SCHEMA"],
"table": os.environ["ALH_TARGET_TABLE"],
"write.mode": "APPEND",
}
).save()
For external-catalog table access, three-part names are also supported:
df = spark.table(f"{os.environ['ALH_CATALOG_ID']}.{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TABLE']}")
df.write.mode("append").insertInto(
f"{os.environ['ALH_CATALOG_ID']}.{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TARGET_TABLE']}"
)
Pushdown
pushdown_opts = aidataplatform_options(
type="ORACLE_ALH",
user=os.environ["ALH_USER"],
password=os.environ["ALH_PASSWORD"],
extra={
"wallet.content": os.environ["ALH_WALLET_CONTENT"],
"tns": os.environ["ALH_TNS"],
"pushdown.sql": "SELECT * FROM HR.EMPLOYEES WHERE DEPARTMENT_ID = 10",
},
)
df = spark.read.format(AIDP_FORMAT).options(**pushdown_opts).load()
IAM DB-token exception (raw Spark JDBC)
AIDP's built-in aidataplatform connector does not support IAM DB-token auth yet. If the user explicitly needs DB-token, use raw Spark JDBC with the helper package:
import os
from oracle_ai_data_platform_connectors.auth import generate_db_token
from oracle_ai_data_platform_connectors.auth.dbtoken import refresh_on_executors
from oracle_ai_data_platform_connectors.jdbc import (
build_oracle_jdbc_url, spark_jdbc_options_dbtoken,
)
token_dir = generate_db_token(
compartment_ocid=os.environ["ALH_COMPARTMENT_OCID"],
target_dir="/tmp/dbcred_alh",
)
url = build_oracle_jdbc_url(
tns_alias=os.environ["ALH_TNS"],
tns_admin=os.environ["ALH_WALLET_DIR"], # extracted wallet directory under /tmp
)
opts = spark_jdbc_options_dbtoken(url=url, token_dir=token_dir)
df = (
spark.read.format("jdbc")
.options(**opts)
.option("dbtable", f"{os.environ['ALH_SCHEMA']}.{os.environ['ALH_TABLE']}")
.load()
)
df.show()
# For long-running jobs, refresh the DB token on executors before partition work.
refresh = refresh_on_executors(spark, os.environ["ALH_COMPARTMENT_OCID"], token_dir)
Gotchas
- Prefer
catalog.idwhen the connection already exists in AIDP; it keeps host, wallet, and credentials out of generated notebooks. - For source-side filtering, prefer
pushdown.sqlfor precise Oracle SQL semantics, or DataFrame.select(...).filter(...).limit(...)when automatic pushdown is enough. - Use
wallet.contentorwallet.pathwith the built-in connector; do not materialize wallets into/tmpunless you are intentionally falling back to raw Spark JDBC. - IAM DB-token is the main intentional raw JDBC fallback because
aidataplatformdoes not support it yet. ORACLE_ALHandORACLE_ATPare separate connector type literals. UseORACLE_ATPwhen adapting the ATP sample exactly.- Instance Principal / Resource Principal are blocked in AIDP notebooks today (IMDS unreachable, RP tokens not provided). Do not try
InstancePrincipalsSecurityTokenSigner().
References
- Helper: scripts/oracle_ai_data_platform_connectors/aidataplatform.py
- Official ALH sample: data-engineering/ingestion/Read_Write_Oracle_Ecosystem_Connectors/Autonomous_AI_Lakehouse.ipynb
- Official ATP sample: data-engineering/ingestion/Read_Write_Oracle_Ecosystem_Connectors/Autonomous_Transaction_Processing.ipynb
- AIDP notebook auth limits:
Claude context/AIDP/AIDP Context/AIDP/aidp-notebook-authentication.md
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。