10 连接到计算
本节介绍如何将 Oracle AI Data Platform 中的计算连接到其他商务智能工具。
连接
您可以将 Oracle AI Data Platform 与 Oracle Analytics Cloud 或其他商务智能工具连接起来。
您可以使用 AI Data Platform 提供的定制 JDBC 或 ODBC 从不同的商务智能工具连接到 AI Data Platform 。AI Data Platform 还支持来自第三方商业 BI 工具(Tableau、Power BI)或开源 BI 工具(如 DBeaver)的连接。要从这些工具进行连接,您需要 AI 数据平台中计算集群的连接详细信息,您可以在“连接详细信息”选项卡中找到这些详细信息。所需的信息因所连接的产品而异。

将 Oracle Analytics 连接到 Oracle AI Data Platform
您可以从 Oracle Analytics Cloud 实例连接到由 Oracle AI Data Platform 实例管理的目录或表。
要创建从 Oracle Analytics 到 AI Data Platform 的连接,您需要来自 AI Data Platform 的连接文件和来自 Analytics Cloud 的 API 密钥。
获取 Oracle Analytics 连接配置文件
您需要从 Oracle AI Data Platform 实例下载 config.json 文件,以将其连接到 Oracle Analytics 。
下载 JDBC 驱动程序
您可以从“Connection details(连接详细信息)”选项卡下载 JDBC 驱动程序并为不同的 BI 工具进行配置。
- 导航到工作区,然后单击计算。
- 单击要连接到 JDBC 兼容 BI 工具的集群,然后单击连接。
- 单击下载 JDBC 驱动器。
配置 DBeaver
您需要安装 DBeaver 并准备从 Oracle AI Data Platform 下载的文件,然后才能将其连接到 AI Data Platform 中的计算集群。
- 下载并安装 DBeaver 客户机。您可以使用 Community 版本或 Enterprise 版本,但它们必须至少 22.x.DBeaver 只能用于 Windows、Mac OS X、Eclipse 插件和 Linux。
- 从下载 JDBC 驱动程序中解压缩文件。
- 从解压缩的文件中解压缩
simbaSpark.zip驱动程序文件。
使用 Spark Simba JDBC 驱动程序配置 DBeaver
您可以将 DBeaver 配置为连接到 Oracle AI Data Platform 中的计算集群。
- 打开 DBeaver。
- 单击数据库导航器。
- 单击驱动程序管理器。
- 单击新建。
- 输入 AI 数据平台作为驱动程序名称。
- 单击库。
- 单击添加文件夹。
- 浏览到 sparkSimba.zip 提取的位置。
- 单击查找类。
- 选择确定。
- 将 Driver class 设置为 com.simba.spark.jdbc.Driver 。
- 单击设置。
- 将 Class Name 设置为 com.simba.spark.jdbc.Driver 。
- 单击确定。
在 DBeaver 中创建数据库连接
要将 DBeaver 连接到 Oracle AI Data Platform 中的计算集群,您需要先在 DBeaver 中创建数据库连接。
- 打开 DBeaver。
- 单击数据库中。
- 单击新建数据库连接。
- 单击全部。
- 选择 AI Data Platform 。
- 单击下一步。
- 输入 JDBC 驱动器的 URL。您可以在 AI 数据平台的计算集群的连接详细信息选项卡上找到 JDBC URL。
- 单击完成。
使用 JDBC 将 DBeaver 连接到 Oracle AI Data Platform
配置 DBeaver 并与 Oracle AI Data Platform 建立数据库连接后,您可以完成 DBeaver 与 AI Data Platform 之间的连接。
- 打开 DBeaver。
- 单击连接。
- 选择使用授权令牌或 API 密钥进行连接。
- 使用授权令牌进行连接
- 如果您没有 DEFAULT 配置文件,请通过在 URL 中不指定任何配置文件来使用标记。例如:
jdbc:spark://gateway.aidp.me-riyadh-1.oci.oraclecloud.com/default;SparkServerType=AIDP;httpPath=cliservice/cf18b4ef-b83e-41dd-82b6-8d391584f6c5URL 将打开浏览器窗口。
登录到创建 AI Data Platform 实例的租户。
有关更多信息,请参见 Token-based Authentication for the CLI 。
- 如果您没有 DEFAULT 配置文件,请通过在 URL 中不指定任何配置文件来使用标记。例如:
-
使用 API 密钥进行连接,方法是在连接 URL 中通过
ociProfile=<profile_name>指定 OCI 配置文件。- 使用 API 密钥验证连接到 AI 数据平台实例。
通过在连接 URL 中使用
ociProfile=<profile_name>指定 OCI 配置文件来使用 API 密钥。例如,要使用 OCI Profile name Demo,请执行以下操作:jdbc:spark://gateway.aidp.me-riyadh-1.oci.oraclecloud.com/default;SparkServerType=AIDP;httpPath=cliservice/cf18b4ef-b83e-41dd-82b6-8d391584f6c5 ;ociProfile=Demo有关更多信息,请参见 Required Keys and OCIDs 。
- 使用 API 密钥验证连接到 AI 数据平台实例。
- 使用授权令牌进行连接
- DBeaver 创建用于读取元数据的连接,以及用于所有其他操作的连接。如果您对连接受限,则可以禁用第二个连接,以便 DBeaver 对所有操作使用一个连接。
- 单击首选项。
- 单击公用。
- 单击元数据。
- 取消选择为元数据读取打开单独的连接。
SQL 语句执行 API
可以使用 SQL 语句执行 API 从外部应用程序、自动化或代理在计算集群上运行只读 SQL 语句。
API 直接为小结果集返回结果,或者为大结果提供临时链接。SQL 语句执行 API 使用 Oracle Cloud Infrastructure 请求签名。语句使用已验证呼叫者的身份和权限运行。您可以提交对账单,检索其状态和结果,以及取消正在运行的对账单。
- 状态为“活动”的已启动计算集群
- 计算集群密钥 (ID)。您可以在群集的 Details(详细信息)选项卡中的 "General"(常规)信息下找到此信息。
- 集群的网关主机名。您可以在集群的连接详细信息选项卡的 JDBC 驱动程序或 ODBC 驱动程序下找到主机名。
- 您正在使用的 CLI 终端或应用程序中的 OCI CLI 安全令牌配置文件。您可以通过运行
oci session authenticate --profile-name <profile-name>并按照提示进行登录。
如何设置连接值
确保已为配置了 OCI CLI 的终端或应用程序中的环境设置连接值。
export BASE_URI="https://<gateway-host>"
export COMPUTE_CLUSTER_KEY="<compute-cluster-key>"
export REGION="<region>"
export PROFILE="<oci-profile>"
export REQ_SUFFIX="$(date +%s)"export BASE_URI="https://dev1.gateway.dataflow.us-phoenix-1.oci.oc-test.com:443"
export COMPUTE_CLUSTER_KEY="12345a67-b89c-1d23-4567-ef8912345ghi"
export REGION="us-phoenix-1"
export PROFILE="MYPROFILE"
export REQ_SUFFIX="20261022-123456"SQL 语句 API 操作
要为 SQL 语句执行 API 运行操作,需要从 Oracle Cloud Infrastructure CLI 调用端点。
您可以从配置有 OCI CLI 的终端或应用运行以下操作。
SQL 语句执行 API 请求选项
创建 SQL 语句执行 API 请求时使用以下请求字段。
| 域 | 说明 |
|---|---|
statement |
必需。只读 SQL 语句。 |
wait_timeout |
可选。API 在返回响应之前等待语句完成的最长时间。 |
disposition |
指定 INLINE 或 EXTERNAL_LINKS。 |
row_limit |
为语句保留的最大行数。 |
byte_limit |
语句保留的最大字节数。 |
catalog |
可选。执行语句时要使用的目录。 |
schema |
可选。执行语句时要使用的方案。 |
parameters |
可选。由 SQL 语句的命名参数值组成的数组。 |
query_tags |
可选。用于标识和跟踪语句的键 - 值标记。指定不超过 20 个条目。 |
request_id |
可选。调用方提供的相关性或幂等标识符。仅对相同的逻辑请求重复使用该值。 |
opc-request-id |
可选。用于跟踪请求的请求标头。仅使用字母、数字、下划线和连字符。 |
提交 SQL 语句
SQL 语句已提交到此 API 端点:
POST /20200129/computeClusters/<compute-cluster-key>/workbench/sql/statementswait_timeout 值 10 秒:oci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements" \
--http-method POST \
--request-headers "$(printf '{"Content-Type":"application/json","opc-request-id":"sql-submit-%s","opc-retry-token":"sql-submit-%s"}' "$REQ_SUFFIX" "$REQ_SUFFIX")" \
--request-body '{"statement":"SELECT 1 AS api_smoke_test","wait_timeout":"10s","on_wait_timeout":"CONTINUE","format":"JSON_ARRAY","disposition":"INLINE","row_limit":100,"byte_limit":1048576}' \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| tee /tmp/sql-submit.json \
| jq '{http_status:.status, statement_id:.data.statement_id, state:.data.status.state, result:.data.result.data_array, opc_request_id:.headers["opc-request-id"]}'{
"http_status": "200 OK",
"statement_id": "095865c4-27ce-41cc-99bb-67af1de760b2",
"state": "SUCCEEDED",
"result": [
[
"1"
]
],
"opc_request_id": "sql-submit-20261022-214855/FBBFDCB770BDEFBC654EAE933E45E811/6CD8518A6A62E6411552DBFEF5ECEAD7"
}wait_timeout 字段指定 API 在返回响应之前等待语句完成的时间。如果语句在指定的等待时间内完成,则 API 将返回 200 OK 并包含语句结果。如果语句在此时间内未完成,则 API 将返回 202 Accepted 并继续运行该语句。
您可以修改 jq 筛选器以显示应用程序所需的响应字段。该命令将完整的 API 响应保存在临时文件 /tmp/sql-submit.json 中,可以复查该文件以了解其他响应详细信息。
提交具有外部链接的报表
oci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements" \
--http-method POST \
--request-headers '{"Content-Type":"application/json","opc-request-id":"req-sql-external-'"$REQ_SUFFIX"'","opc-retry-token":"retry-sql-external-'"$REQ_SUFFIX"'"}' \
--request-body "$(jq -nc --arg request_id "sql-external-$REQ_SUFFIX" '{
statement: "SELECT id, sha2(cast(id AS STRING), 256) AS hash FROM range(2000)",
wait_timeout: "30s",
on_wait_timeout: "CONTINUE",
format: "JSON_ARRAY",
disposition: "EXTERNAL_LINKS",
row_limit: 2000,
byte_limit: 1048576,
request_id: $request_id
}')" \
--no-retry \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| tee /tmp/sql-external-submit.json \
| jq '(.data.result // {}) as $result |
{
http_status: .status,
statement_id: .data.statement_id,
state: .data.status.state,
disposition: .data.manifest.disposition,
first_chunk_index: ($result.external_links[0].chunk_index // null),
first_chunk_row_count: ($result.external_links[0].row_count // null),
next_chunk_index: $result.next_chunk_index,
external_link_count: (($result.external_links // []) | length),
truncated: .data.manifest.truncated,
opc_request_id: .headers["opc-request-id"]
}'{
"http_status": "200 OK",
"statement_id": "661527ef-dd96-480f-b65a-ac63aad6b910",
"state": "SUCCEEDED",
"disposition": "EXTERNAL_LINKS",
"first_chunk_index": 0,
"first_chunk_row_count": 1000,
"next_chunk_index": 1,
"external_link_count": 1,
"truncated": false,
"opc_request_id": "req-sql-external-20261022-225359/6D4D256A0952BA3E8A21A8F4299E35FC/062DA0791BE4E344828CD8F4DE538FD6"
}在此示例中,临时外部结果链接保存在 /tmp/sql-external-submit.json 中,不会显示在命令响应中。
注意:
请勿共享外部结果链接或将其存储在源代码、日志、票证或其他可广泛访问的位置。具有有效链接的任何人都可以访问关联的结果数据,直到链接到期。如果 truncated 为 true,则返回的结果达到指定的行限制或字节限制。
设置 statement_id
statement_id。提交语句时,可以设置 statement_id,如下所示:export STATEMENT_ID="095865c4-27ce-41cc-99bb-67af1de760b2"
echo "${STATEMENT_ID}"statement_id:export STATEMENT_ID="$(jq -r '.data.statement_id' /tmp/sql-submit.json)"请求 SQL 语句状态
statement_id 检索其状态:GET /20200129/computeClusters/<compute-cluster-key>/workbench/sql/statements/<statement-id>以下示例使用语句的 statement_id 检索语句的状态:
oci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements/${STATEMENT_ID}" \
--http-method GET \
--request-headers "$(printf '{"opc-request-id":"sql-status-%s"}' "$REQ_SUFFIX")" \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| jq '{http_status:.status, statement_id:.data.statement_id, state:.data.status.state, error:.data.status.error, code:.data.code, message:.data.message, opc_request_id:.headers["opc-request-id"]}'{
"http_status": "200 OK",
"statement_id": "095865c4-27ce-41cc-99bb-67af1de760b2",
"state": "SUCCEEDED",
"error": null,
"code": null,
"message": null,
"opc_request_id": "sql-status-20261022-223517/A80E5E3A0BE5C2673C45E76C5A076B5F/890C178EA4CE5BC332681A546D3FB072"
}PENDINGRUNNINGSUCCEEDEDFAILEDCANCELLED
202 Accepted 的语句,检索状态,直到该语句达到终端状态:SUCCEEDED、FAILED 或 CANCELLED。
请求报表结果
语句完成时,可以使用 statement_id 检索其结果,并使用以下端点获取结果 chunk-index:
GET /20200129/computeClusters/<compute-cluster-key>/workbench/sql/statements/<statement-id>/result/chunks/<chunk-index>设置 chunk-index 以确定调用端点时检索到的结果。chunk-index 为 0 将检索第一个结果。您可以通过检查响应中的 next_chunk_index 来确定下一个结果的 chunk-index。如果 next_chunk_index 为 null,则表明没有其他结果块。
export CHUNK_INDEX="0"
export REQ_SUFFIX="$(date +%s)"您可以使用 row_limit 和 byte_limit 来控制服务保留和返回的结果数据量。当达到任一限制时,响应可以指示结果被截断。一个成功的语句并不意味着所有源行都保留在结果中。
本示例演示了对语句结果的请求:
oci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements/${STATEMENT_ID}/result/chunks/${CHUNK_INDEX}" \
--http-method GET \
--request-headers "$(printf '{"opc-request-id":"sql-result-chunk-%s"}' "$REQ_SUFFIX")" \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| jq '(.data.result // .data) as $result |
{
http_status: .status,
statement_id: .data.statement_id,
chunk_index: $result.chunk_index,
row_count: $result.row_count,
row_offset: $result.row_offset,
result: $result.data_array,
next_chunk_index: $result.next_chunk_index,
external_link_count: (($result.external_links // []) | length),
code: .data.code,
message: .data.message,
opc_request_id: .headers["opc-request-id"]
}'对上述示例的响应如下所示:
{
"http_status": "200 OK",
"statement_id": null,
"chunk_index": 0,
"row_count": 1,
"row_offset": 0,
"result": [
[
"1"
]
],
"next_chunk_index": null,
"external_link_count": 0,
"code": null,
"message": null,
"opc_request_id": "sql-result-chunk-20261022-224623/A6702BBF95AEA1AA6D96EFA256B1062B/86AA007BC0A3E6824814EE1A7A246775"
}语句完成时,响应包括语句状态和结果元数据。如果为 disposition 指定 INLINE ,该服务将在响应中返回结果数据。使用 INLINE 可获得应用程序可以立即处理的较小结果。如果指定 EXTERNAL_LINKS ,该服务将存储结果并返回临时链接,而不是将结果数据包括在响应中。使用 EXTERNAL_LINKS 可获得较大的结果。
data_array- 内嵌返回结果时的结果数据。使用 EXTERNAL_LINKS 时,此值为空值。external_links- 使用 EXTERNAL_LINKS 时指向结果数据的临时链接。row_count和byte_count- 返回的结果块中的行数和字节数。next_chunk_index- 当有更多结果数据可用时,下一个结果块的索引。truncated- 指示服务是否仅保留部分结果,因为已达到请求的行或字节限制。expires_at- 保留结果数据和临时外部链接到期的时间。
取消提交的对账单
您可以取消正在运行的语句。您需要对尝试取消的语句使用 statement_id。
POST /20200129/computeClusters/<compute-cluster-key>/workbench/sql/statements/<statement-id>/canceloci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements/${STATEMENT_ID}/cancel" \
--http-method POST \
--request-headers "$(printf '{"Content-Type":"application/json","opc-request-id":"sql-cancel-%s"}' "$REQ_SUFFIX")" \
--request-body '{}' \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| jq '{http_status:.status, statement_id:.data.statement_id, cancel_state:.data.cancel_state, state:.data.status.state, error:.data.status.error, code:.data.code, message:.data.message, opc_request_id:.headers["opc-request-id"]}'{
"http_status": "200 OK",
"statement_id": "9b8ca043-5620-469a-b07c-51d5b99b9963",
"cancel_state": "COMPLETED",
"state": "CANCELED",
"error": null,
"code": null,
"message": null,
"opc_request_id": "sql-cancel-20261022-231732/1BA0029F78EFABC8F3A7D7D8F52E278F/CFB5C5994AF3861143602D08794A2628"
}取消完成后,API 将返回 200 OK。响应包括语句 ID 和状态 CANCELED。
statement_id 检索语句状态,可以确认取消:oci raw-request \
--target-uri "${BASE_URI}/20200129/computeClusters/${COMPUTE_CLUSTER_KEY}/workbench/sql/statements/${LONG_STATEMENT_ID}" \
--http-method GET \
--request-headers "$(printf '{"opc-request-id":"req-sql-canceled-status-%s"}' "$REQ_SUFFIX")" \
--no-retry \
--region "${REGION}" \
--auth security_token \
--profile "${PROFILE}" \
| jq '{http_status:.status, statement_id:.data.statement_id, state:.data.status.state, cancel_requested:.data.cancel_requested, error:.data.status.error, opc_request_id:.headers["opc-request-id"]}'{
"http_status": "200 OK",
"statement_id": "9b8ca043-5620-469a-b07c-51d5b99b9963",
"state": "CANCELED",
"cancel_requested": true,
"error": null,
"opc_request_id": "req-sql-canceled-status-20261022/727A96500CCB1BBCF311B91390F7370C/9231C1802E3466B9AF5FBDEA56D0A9EA"
}指定目录或方案
提交 SQL 语句时,可以指定目录和/或方案。在请求中指定的值将覆盖当前会话上下文。指定目录和方案以在特定目录和方案中运行语句。
{
"statement": "SELECT * FROM orders LIMIT 10",
"catalog": "sales_catalog",
"schema": "reporting",
"wait_timeout": "10s",
"on_wait_timeout": "CONTINUE",
"format": "JSON_ARRAY",
"disposition": "INLINE"
}只能指定 catalog 以选择目录。要确保语句使用特定方案,请同时指定 catalog 和 schema。
只能指定 schema 以选择当前目录中的方案。省略 catalog 时,还可以指定限定方案名称,例如 sales_catalog.reporting。
如果未指定 catalog 或 schema,则该语句将使用当前会话目录和方案。如果指定的目录或方案不存在,或者调用方无权访问,则语句可以完成,状态为 FAILED。检查每个已完成的语句响应中的 status.state 和 status.error。目录或方案字段语法无效,返回 400 Bad Request。
命名参数
可以在 SQL 语句中使用指定的参数。通过使用冒号后跟参数名称(如 :id)在语句中指定参数。不支持位置参数(例如 ?)。在 parameters 数组中指定参数值。每个参数都包含以下字段:
| 域 | 说明 |
|---|---|
name |
必需。不带冒号 (:) 前缀的参数名称。 |
value |
必需。参数值。以字符串形式提供值。 |
type |
可选。参数值的类型提示。 |
:id 和 :name 的值:{
"statement": "SELECT :id AS id, :name AS name",
"parameters": [
{
"name": "id",
"value": "42",
"type": "INT"
},
{
"name": "name",
"value": "example",
"type": "STRING"
}
],
"wait_timeout": "10s",
"on_wait_timeout": "CONTINUE",
"format": "JSON_ARRAY",
"disposition": "INLINE"
}API 支持以下参数类型提示:- 布尔值:布尔值
- 整数:BYTE、TINYINT、SHORT、SMALLINT、INT、INT、INTEGER、LONG、BIGINT
- 数值:FLOAT、DOUBLE、DECIMAL、NUMERIC
- 日期和时间:DATE、TIMESTAMP 和 TIMESTAMP_NTZ
- 字符:字符串、字符、VARCHAR
SQL 语句执行 API 响应故障排除
| 响应 | 解决方案 |
|---|---|
400 Bad Request |
验证请求是否包含支持的只读语句和有效的请求值。 |
401 或 403 |
验证 OCI 验证以及您对计算集群和查询数据的权限。 |
404 Not Found |
验证区域、计算集群密钥、调用方身份和语句 ID。 |
503 Service Unavailable |
等待计算集群处于活动状态,然后重试。 |
使用 Spark Connect 连接到外部应用
您可以使用 Spark Connect 在 Oracle AI Data Platform 计算集群上从受支持的 Python 或 Java 应用运行 Spark 代码。
当集群执行 DataFrame 操作和 Spark SQL 查询时,您可以从本地 IDE 或外部应用程序进行操作。例如,您可以在本地开发数据转换,针对集群可用的数据运行数据转换,并在应用程序中检索结果。
- 状态为“活动”的计算集群。
- 对您正在使用的集群和数据使用权限或更高权限。
- 对端口 443 上的 Spark Connect 集群主机名的网络访问。
- 计算集群密钥 (ID)。您可以在群集的 Details(详细信息)选项卡中的 "General"(常规)信息下找到此信息。
- 集群的网关主机名。您可以在集群的连接详细信息选项卡的 JDBC 驱动程序或 ODBC 驱动程序下找到主机名。
- OCI 验证配置文件和兼容的 Spark Connect 客户端。
AI Data Platform 支持 Python 和 Java 客户机,并且对每个客户机具有以下要求:
| 客户端 | 要求 |
|---|---|
| Python | Python 3。9 – 3.11,PySpark 连接 3.5.1 |
| Java | JDK 17、Maven 3.8 或更高版本、Spark Connect JVM 客户端 3.5.1 |
使用 Python 客户端连接到 Spark Connect
此 Python 示例包括使用 OCI 进行验证和创建远程 Spark 会话所需的连接设置。
注意:
提供的示例为记录的 Spark 3.5.1 客户机禁用可重新连接的执行:spark.client.disable_reattachable_execute() 在调整示例时保留此设置。Spark Connect 故障排除
提供的表列出了在配置到 Oracle AI Data Platform 的 Spark Connect 连接时可能遇到的常见问题,并提供了潜在原因。
| 问题 | 要检查的内容 |
|---|---|
| 应用程序无法连接 | 确认集群处于活动状态,并且您的环境可以访问端口 443 上的网关主机名。 |
| 验证成功 | 检查 OCI 配置文件路径、概要信息名称和身份证明。刷新过期的会话身份证明。 |
| 授权失败或找不到资源 | 检查主机名和群集密钥。确认租户启用和使用集群的权限。 |
| 查询无法访问表 | 检查目录、方案和表名称,并确认已验证身份有权访问数据。 |
Python 报告缺少 pyspark 或 oci 模块
|
安装提供的依赖项并使用 .venv/bin/python 运行示例。
|
| Python 加载一个意外的 Spark 版本 | 将所记录的命令与 PYTHONPATH 一起使用,并删除 SPARK_HOME。 |
| Java 报告缺少依赖项或不兼容的库 | 按照 Java 包随附的设置说明操作,并使用其指定的相关项版本。 |


