claude-skills/

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

last sync 22h ago
スキルOfficialdevelopment

🗄️aidp-jdbc-custom

説明

JDBCドライバーが存在するあらゆるデータベースに、Sparkネイティブの `format("jdbc")` を使用してAIDPノートブックから接続します。 次のような場合に使用: - 専用のAIDPコネクターが存在しないDB(SQLite、ClickHouse、DuckDBなど)をユーザーが指定した場合 - 汎用のJDBC URLを使用したい場合 - ユーザーがアップロードしたカスタムJDBCドライバーを使用したい場合 認証方式はドライバーごとに異なります。

原文を表示

Connect to ANY database that has a JDBC driver from an AIDP notebook using Spark's native `format("jdbc")`. Use when the user mentions a DB without a dedicated AIDP connector — SQLite, ClickHouse, DuckDB, generic JDBC URL — or wants to use a custom JDBC driver they uploaded. Auth is driver-specific.

ユースケース

  • 専用コネクターがないDBを接続する
  • 汎用JDBC URLを使用したい
  • カスタムJDBCドライバーを使用する

本文(日本語訳)

aidp-jdbc-custom — 汎用 JDBC エスケープハッチ

JDBC ドライバーを持つあらゆる DB に対応するキャッチオール skill です。 AIDP の aidataplatform フォーマットをスキップし、ネイティブの Spark JDBC を使用します。 SQLite、ClickHouse、DuckDB、IBM DB2、SAP HANA、またはユーザーがアップロードしたニッチなドライバーなど、専用 skill が存在しない DB に有用です。

次のような場合に使用

  • 対象の DB がこの plugin に専用の aidp-* skill を持たない場合
  • ユーザーが使用したい .jar 形式の JDBC ドライバーを持っている場合
  • 「custom JDBC」「JDBC driver」「any JDBC」といったキーワードが言及された場合

使用してはいけない場合

  • Postgres / MySQL / SQL Server / Oracle の場合 → 専用 skill を使用してください。 aidataplatform フォーマットは、この skill にはないコネクタープッシュダウンおよびコネクションプーリングを提供します。
  • Snowflake の場合 → aidp-snowflake を使用してください。 Spark コネクターは生の JDBC よりもはるかに優れています。

非バンドル JDBC ドライバーを読み込む 2 つの方法

オプション A — ランタイムロード(推奨:クラスター再起動不要)

この plugin には、Java の URLClassLoader と DriverManager を使って JDBC JAR を実行中の Spark セッションに読み込むヘルパーが同梱されています。 管理者権限なし、かつカーネルを再起動することなく動作します。

import os
from oracle_ai_data_platform_connectors.jdbc import (
    add_jdbc_jar_at_runtime, download_jdbc_jar,
)

# 一度だけダウンロード(Maven Central は AIDP クラスターから到達可能)
jar = download_jdbc_jar(
    maven_url="https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.46.0.0/sqlite-jdbc-3.46.0.0.jar",
    target_path="/tmp/sqlite-jdbc-3.46.0.0.jar",
)

# 実行中の Spark セッションに登録
add_jdbc_jar_at_runtime(spark, jar_path=jar, driver_class="org.sqlite.JDBC")

# これで標準の Spark JDBC が利用可能になる
df = (spark.read.format("jdbc")
      .option("url",      "jdbc:sqlite::memory:")
      .option("driver",   "org.sqlite.JDBC")
      .option("dbtable",  "(SELECT 1 AS c1, 2 AS c2, 3 AS c3)")
      .option("fetchsize","1000")
      .load())
df.show()

このヘルパーは scripts/oracle_ai_data_platform_connectors/jdbc/runtime_load.py に実装されています。 内部的には、既存のスレッドコンテキストローダーをルートとした URLClassLoader を構築し、DriverManager.registerDriver を呼び出した後、Spark の Utils.classForName がドライバークラスを解決できるよう JVM スレッドコンテキストクラスローダーを設定します。

オプション B — クラスター Library タブ(永続的・管理者権限が必要)

頻繁に使用するドライバーの場合は、JAR を Volume にアップロードし、クラスターの Library タブ経由でアタッチします。 この方法はクラスターの再起動後も設定が維持されます。ただしクラスター管理者権限が必要です。 アタッチして再起動した後:

# ドライバークラスがシステムクラスパス上に存在するため、ランタイムの工夫は不要
df = (spark.read.format("jdbc")
      .option("url", JDBC_URL).option("driver", DRIVER)
      .option("dbtable", TABLE).load())

汎用テンプレート

df = (spark.read.format("jdbc")
      .option("url",      "jdbc:<vendor>://<host>:<port>/<db>")
      .option("driver",   "<full.class.Name>")
      .option("user",     os.environ["CUST_DB_USER"])
      .option("password", os.environ["CUST_DB_PASSWORD"])
      .option("dbtable",  os.environ["CUST_DB_TABLE"])
      .option("fetchsize", "10000")
      .load())

主なドライバークラス一覧

DB ドライバークラス URL プレフィックス
SQLite org.sqlite.JDBC jdbc:sqlite:
ClickHouse com.clickhouse.jdbc.ClickHouseDriver jdbc:clickhouse://
DuckDB org.duckdb.DuckDBDriver jdbc:duckdb:
IBM DB2 com.ibm.db2.jcc.DB2Driver jdbc:db2://
SAP HANA com.sap.db.jdbc.Driver jdbc:sap://
Vertica com.vertica.jdbc.Driver jdbc:vertica://

注意点

  • Spark JDBC が推論する範囲を超えた述語プッシュダウンはありません。 この skill はエスケープハッチであり、最適化されたパスではありません。
  • dbtable はサブクエリを受け付けます — ソース側でフィルタリングするには括弧で囲んでください: option("dbtable", "(SELECT * FROM big_table WHERE date > '2025-01-01') t")
  • fetchsize=10000 は適切なデフォルト値です。小さすぎるとドライバーの通信回数が増え、大きすぎると Executor で OOM が発生するリスクがあります。
  • パーティショニング — 並列読み込みを行うには、option("partitionColumn", ...), option("lowerBound", ...), option("upperBound", ...), option("numPartitions", N) を使用してください。これらを指定しない場合、読み込みは単一パーティションのシリアル処理になります。
  • ドライバー JAR の不一致ClassNotFoundException: <driver class> が発生した場合は、JAR が実行中のクラスターにアタッチされているか(Volume にアップロードされているだけではないか)を再確認してください。

参考資料

原文(English)を表示

aidp-jdbc-custom — Generic JDBC escape hatch

The catch-all skill for any DB with a JDBC driver. Skips the AIDP aidataplatform format and uses native Spark JDBC. Useful for DBs like SQLite, ClickHouse, DuckDB, IBM DB2, SAP HANA, or any niche driver the user has uploaded.

When to use

  • The DB doesn't have a dedicated aidp-* skill in this plugin.
  • User has a .jar JDBC driver they want to use.
  • Mentioned: "custom JDBC", "JDBC driver", "any JDBC".

When NOT to use

  • For Postgres / MySQL / SQL Server / Oracle → use the dedicated skill. The aidataplatform format gives the connector pushdown and connection pooling that this skill doesn't.
  • For Snowflake → aidp-snowflake. The Spark connector is much better than raw JDBC.

Two ways to load a non-bundled JDBC driver

Option A — Runtime-load (recommended; no cluster restart)

The plugin ships a helper that loads a JDBC JAR into a running Spark session via Java's URLClassLoader + DriverManager. It works without admin access and without restarting the kernel.

import os
from oracle_ai_data_platform_connectors.jdbc import (
    add_jdbc_jar_at_runtime, download_jdbc_jar,
)

# Download once (Maven Central is reachable from AIDP clusters)
jar = download_jdbc_jar(
    maven_url="https://repo1.maven.org/maven2/org/xerial/sqlite-jdbc/3.46.0.0/sqlite-jdbc-3.46.0.0.jar",
    target_path="/tmp/sqlite-jdbc-3.46.0.0.jar",
)

# Register with the running Spark session
add_jdbc_jar_at_runtime(spark, jar_path=jar, driver_class="org.sqlite.JDBC")

# Now standard Spark JDBC works
df = (spark.read.format("jdbc")
      .option("url",      "jdbc:sqlite::memory:")
      .option("driver",   "org.sqlite.JDBC")
      .option("dbtable",  "(SELECT 1 AS c1, 2 AS c2, 3 AS c3)")
      .option("fetchsize","1000")
      .load())
df.show()

The helper is implemented at scripts/oracle_ai_data_platform_connectors/jdbc/runtime_load.py — internally it builds a URLClassLoader rooted at the existing thread context loader, calls DriverManager.registerDriver, and sets the JVM thread context class loader so Spark's Utils.classForName resolves the driver class.

Option B — Cluster Library tab (durable, requires admin)

For frequently-used drivers, upload the JAR to a Volume and attach via the cluster Library tab. This persists across cluster restarts. Requires cluster admin access. After attach + restart:

# Driver class is now on the system classpath; no runtime trick needed.
df = (spark.read.format("jdbc")
      .option("url", JDBC_URL).option("driver", DRIVER)
      .option("dbtable", TABLE).load())

Generic template

df = (spark.read.format("jdbc")
      .option("url",      "jdbc:<vendor>://<host>:<port>/<db>")
      .option("driver",   "<full.class.Name>")
      .option("user",     os.environ["CUST_DB_USER"])
      .option("password", os.environ["CUST_DB_PASSWORD"])
      .option("dbtable",  os.environ["CUST_DB_TABLE"])
      .option("fetchsize", "10000")
      .load())

Common driver classes

DB Driver class URL prefix
SQLite org.sqlite.JDBC jdbc:sqlite:
ClickHouse com.clickhouse.jdbc.ClickHouseDriver jdbc:clickhouse://
DuckDB org.duckdb.DuckDBDriver jdbc:duckdb:
IBM DB2 com.ibm.db2.jcc.DB2Driver jdbc:db2://
SAP HANA com.sap.db.jdbc.Driver jdbc:sap://
Vertica com.vertica.jdbc.Driver jdbc:vertica://

Gotchas

  • No predicate pushdown beyond what Spark JDBC infers. This skill is the escape hatch, not the optimized path.
  • dbtable accepts a subquery — wrap in parens to filter at the source: option("dbtable", "(SELECT * FROM big_table WHERE date > '2025-01-01') t").
  • fetchsize=10000 is a good default; smaller values create driver chatter, larger values risk OOM on the executor.
  • Partitioning — for parallel reads, use option("partitionColumn", ...).option("lowerBound", ...).option("upperBound", ...).option("numPartitions", N). Without these the read is single-partition and serial.
  • Driver JAR mismatch — symptom is ClassNotFoundException: <driver class>. Re-check that the JAR is attached to the running cluster (not just uploaded to a Volume).

References

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