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 数据平台中计算集群的连接详细信息,您可以在“连接详细信息”选项卡中找到这些详细信息。所需的信息因所连接的产品而异。


Dev_cluster_1 计算集群的“连接详细信息”选项卡

将 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 。

您需要具有至少 2 个 OCPU、32 GB 内存(适用于驱动程序节点和 worker 节点)以及至少 2 个 worker 的计算集群。
  1. 导航到工作区,然后单击计算。

    计算页已打开,其中突出显示了 Cluster_High 计算集群

  2. 单击要连接到 Oracle Analytics 的集群。
  3. 在连接详细信息选项卡中,单击 Oracle Analytics Cloud 徽标下面的下载图标。config.json 文件将下载到您的计算机。

    已打开 Cluster_High 集群的计算页,其中突出显示了“连接详细信息”选项卡和 Oracle Analytics Cloud 下载

连接到 Oracle Analytics

您可以从 Oracle Analytics 实例连接到由 Oracle AI Data Platform 实例管理的目录或表。

在 Oracle Analytics 中创建连接之前,请确保您具有来自 AI Data Platform 的连接配置文件。请参阅获取 Oracle Analytics 连接配置文件。
Oracle Analytics 与 AI Data Platform 实例的连接仅支持每个连接一个目录。您需要创建其他连接才能使用多个目录。
  1. 在 Oracle Analytics 主页上,依次单击创建和连接。
  2. 单击 Oracle AI Data Platform 。
  3. 为连接输入名称和说明。
  4. 在位置中,指定保存连接的位置。要与其他用户共享连接,请将其保存在 /Shared Folders 中。
  5. 在 Oracle Analytics Cloud 中,对于连接详细信息,单击选择,导航到 config.json 文件,然后单击打开。
  6. 选择 API 密钥作为验证类型。
  7. 在公共 API 密钥下,依次单击生成和复制。
  8. 在 OCI 中,添加 API 密钥。
    1. 在 OCI 中,单击用户图标,然后单击用户设置。
    2. 在“我的概要信息”中,单击令牌和密钥,然后单击添加 API 密钥。
    3. 选择粘贴公共密钥,然后在步骤 7 中生成的密钥中复制,然后单击添加。
    等待两到三分钟,API 密钥才能同步。
  9. 在目录中,指定要在数据集中使用的目录名称。
    如果目录列表未加载,并且您看到预警消息“用户没有足够的权限执行该操作”,请等待 API 密钥稍候以进行同步。
  10. 单击保存。
  11. 通过创建数据集测试新连接。

如果您已按照说明操作,并且仍然在保存连接或列出方案时出现问题,则可能需要重新启动群集。

下载 JDBC 驱动程序

您可以从“Connection details(连接详细信息)”选项卡下载 JDBC 驱动程序并为不同的 BI 工具进行配置。

  1. 导航到工作区,然后单击计算。
  2. 单击要连接到 JDBC 兼容 BI 工具的集群,然后单击连接。
  3. 单击下载 JDBC 驱动器。

配置 DBeaver

您需要安装 DBeaver 并准备从 Oracle AI Data Platform 下载的文件,然后才能将其连接到 AI Data Platform 中的计算集群。

  1. 下载并安装 DBeaver 客户机。您可以使用 Community 版本或 Enterprise 版本,但它们必须至少 22.x.DBeaver 只能用于 Windows、Mac OS X、Eclipse 插件和 Linux。
  2. 从下载 JDBC 驱动程序中解压缩文件。
  3. 从解压缩的文件中解压缩 simbaSpark.zip 驱动程序文件。

使用 Spark Simba JDBC 驱动程序配置 DBeaver

您可以将 DBeaver 配置为连接到 Oracle AI Data Platform 中的计算集群。

您必须已安装 DBeaver 并提取了从 AI 数据平台下载的 simbaSpark.zip 文件。
  1. 打开 DBeaver。
  2. 单击数据库导航器。
  3. 单击驱动程序管理器。
  4. 单击新建。
  5. 输入 AI 数据平台作为驱动程序名称。
  6. 单击库。
  7. 单击添加文件夹。
  8. 浏览到 sparkSimba.zip 提取的位置。
  9. 单击查找类。
  10. 选择确定。
  11. 将 Driver class 设置为 com.simba.spark.jdbc.Driver 。
  12. 单击设置。
  13. 将 Class Name 设置为 com.simba.spark.jdbc.Driver 。
  14. 单击确定。

在 DBeaver 中创建数据库连接

要将 DBeaver 连接到 Oracle AI Data Platform 中的计算集群,您需要先在 DBeaver 中创建数据库连接。

您必须已使用从 AI Data Platform 下载的 Spark Simba JDBC 驱动程序配置 DBeaver。有关详细信息,请参阅使用 Spark Simba JDBC 驱动程序配置 DBeaver 。
  1. 打开 DBeaver。
  2. 单击数据库中。
  3. 单击新建数据库连接。
  4. 单击全部。
  5. 选择 AI Data Platform 。
  6. 单击下一步。
  7. 输入 JDBC 驱动器的 URL。您可以在 AI 数据平台的计算集群的连接详细信息选项卡上找到 JDBC URL。
  8. 单击完成。

使用 JDBC 将 DBeaver 连接到 Oracle AI Data Platform

配置 DBeaver 并与 Oracle AI Data Platform 建立数据库连接后,您可以完成 DBeaver 与 AI Data Platform 之间的连接。

  1. 打开 DBeaver。
  2. 单击连接。
  3. 选择使用授权令牌或 API 密钥进行连接。
    • 使用授权令牌进行连接
      • 如果您没有 DEFAULT 配置文件,请通过在 URL 中不指定任何配置文件来使用标记。例如:jdbc:spark://gateway.aidp.me-riyadh-1.oci.oraclecloud.com/default;SparkServerType=AIDP;httpPath=cliservice/cf18b4ef-b83e-41dd-82b6-8d391584f6c5

        URL 将打开浏览器窗口。

        登录到创建 AI Data Platform 实例的租户。

        有关更多信息,请参见 Token-based Authentication for the CLI 。

    • 使用 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 。

  4. DBeaver 创建用于读取元数据的连接,以及用于所有其他操作的连接。如果您对连接受限,则可以禁用第二个连接,以便 DBeaver 对所有操作使用一个连接。
    1. 单击首选项。
    2. 单击公用。
    3. 单击元数据。
    4. 取消选择为元数据读取打开单独的连接。

下载 ODBC 驱动程序

您可以从“连接详细信息”选项卡下载 ODBC 驱动程序,并为不同的 BI 工具进行配置。

  1. 导航到工作区,然后单击计算。
  2. 单击要连接到 ODBC 兼容 BI 工具的集群,然后单击连接。
  3. 单击 Download ODBC Driver(下载 ODBC 司机)。
  4. 从列表中选择相应的 OS。

    打开 ODBC 驱动程序操作系统下拉列表,其中显示了 Mac、Windows 和 Linx 选项

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/statements
以下示例包括一个可选的结果 wait_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 中,可以复查该文件以了解其他响应详细信息。

提交具有外部链接的报表

可以通过包含外部链接的同一 POST 端点提交语句,如下例所示:
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}"
如果提交响应已保存到 /tmp/sql-submit.json,则可以按如下方式设置 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"
}
语句可以具有以下状态:
  • PENDING
  • RUNNING
  • SUCCEEDED
  • FAILED
  • CANCELLED
对于返回 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 请求:
POST /20200129/computeClusters/<compute-cluster-key>/workbench/sql/statements/<statement-id>/cancel
此示例演示了取消语句的请求:
oci 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 响应故障排除

使用下表帮助对常见 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 或外部应用程序进行操作。例如,您可以在本地开发数据转换,针对集群可用的数据运行数据转换,并在应用程序中检索结果。

要使用 Spark Connect,请确保您具有以下功能:
  • 状态为“活动”的计算集群。
  • 对您正在使用的集群和数据使用权限或更高权限。
  • 对端口 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_connect_example.py 和 requirements.txt:Spark Connect Examples 。
  1. 在提取的示例目录中打开一个终端。创建虚拟环境并安装相关项:
    python3 -m venv .venv
    .venv/bin/python -m pip install --upgrade pip
    .venv/bin/python -m pip install -r requirements.txt

    使用提供的依赖性文件安装兼容版本的客户机库。

  2. 在终端中,设置主机名、集群密钥和 OCI 配置文件:
    export SPARK_CONNECT_HOST="<hostname>"
    export SPARK_CONNECT_CLUSTER_KEY="<compute-cluster-key>"
    export SPARK_CONNECT_OCI_CONFIG_FILE="$HOME/.oci/config"
    export SPARK_CONNECT_OCI_CONFIG_PROFILE="<profile-name>"
    将尖括号中的值替换为连接详细信息。所选 OCI 配置文件必须包含有效的 API 密钥或安全令牌身份证明。例如:
    export SPARK_CONNECT_HOST="dev.gateway.example.us-phoenix-1.oci.oc-test.com"
    export SPARK_CONNECT_CLUSTER_KEY="a12345b6-cdef-789g-123h-45678i9j1234"
    export SPARK_CONNECT_OCI_CONFIG_FILE="$HOME/.oci/config"
    export SPARK_CONNECT_OCI_CONFIG_PROFILE="MYPROFILE"
  3. 验证连接:
    SPARK_CONNECT_OCI_AUTH_MODE=config \
    SPARK_CONNECT_EXAMPLE_TYPE=both \
    env -u PYTHONPATH -u SPARK_HOME \
    .venv/bin/python spark_connect_example.py

    选择与您的配置文件匹配的验证方法:

    验证类型 设置
    API 密钥 SPARK_CONNECT_OCI_AUTH_MODE=api_key
    安全令牌 SPARK_CONNECT_OCI_AUTH_MODE=security_token

    此示例运行 DataFrame 操作和 Spark SQL 查询。两者均返回 ID 0 到 4,并返回其平方值。终端将结果显示为收集的行。如果两个操作都完成,应用程序将通过验证、连接到集群并运行 Spark 代码。

  4. 使用由示例创建的经过验证的 Spark 会话运行您自己的操作。打开 spark_connect_example.py,并将 try 块内的示例操作替换为您的应用程序代码。保留用于创建已验证 Spark 会话的现有代码。
    例如,要使用 DataFrame,可以使用以下命令:
    frame = spark.range(5)
    
    result = frame.withColumn(
        "squared",
        frame["id"] * frame["id"]
    )
    
    result.show()
    要运行 Spark SQL,可以使用以下命令:
    spark.sql(
        "SELECT id, id * id AS squared FROM range(5)"
    ).show()

    查询自己的表时,请使用适当的目录和方案。您的身份必须具有访问这些表的权限。

  5. 应用完成后,关闭 Spark 会话:
    spark.stop()

注意:

提供的示例为记录的 Spark 3.5.1 客户机禁用可重新连接的执行:
spark.client.disable_reattachable_execute()
在调整示例时保留此设置。

使用 Java 客户端连接到 Spark Connect

此 Java 示例包括使用 OCI 进行验证和创建远程 Spark 会话所需的连接设置。

此示例需要此捆绑包中提供的 SparkConnectExample.java 和 pom.xml:Spark Connect Examples 。
  1. 提取包并打开 filename。按照提供的说明安装捆绑包内容。
  2. 在提取的示例目录中打开一个终端。设置相同的主机名、群集密钥、配置文件路径和配置文件:
    export SPARK_CONNECT_HOST="<hostname>"
    export SPARK_CONNECT_CLUSTER_KEY="<compute-cluster-key>"
    export SPARK_CONNECT_OCI_CONFIG_FILE="$HOME/.oci/config"
    export SPARK_CONNECT_OCI_CONFIG_PROFILE="<profile-name>"
    export SPARK_CONNECT_EXAMPLE_TYPE=both
    将尖括号中的值替换为连接详细信息。所选 OCI 配置文件必须包含有效的 API 密钥或安全令牌身份证明。例如:
    export SPARK_CONNECT_HOST="dev.gateway.example.us-phoenix-1.oci.oc-test.com"
    export SPARK_CONNECT_CLUSTER_KEY="a12345b6-cdef-789g-123h-45678i9j1234"
    export SPARK_CONNECT_OCI_CONFIG_FILE="$HOME/.oci/config"
    export SPARK_CONNECT_OCI_CONFIG_PROFILE="MYPROFILE"
    export SPARK_CONNECT_EXAMPLE_TYPE=both
  3. 验证连接:
    SPARK_CONNECT_OCI_AUTH_MODE=config \
    SPARK_CONNECT_EXAMPLE_TYPE=both \
    env -u PYTHONPATH -u SPARK_HOME \
    .venv/bin/python spark_connect_example.py"

    选择与您的配置文件匹配的验证方法:

    验证类型 设置
    API 密钥 SPARK_CONNECT_OCI_AUTH_MODE=api_key
    安全令牌 SPARK_CONNECT_OCI_AUTH_MODE=security_token

    此示例运行 DataFrame 操作和 Spark SQL 查询。两者均返回 ID 0 到 4,并返回其平方值。终端将结果显示为收集的行。如果两个操作都完成,应用程序将通过验证、连接到集群并运行 Spark 代码。

  4. 使用示例创建的经过验证的 Spark 会话运行您自己的操作。
    例如,要使用 DataFrame,可以使用以下命令:
    frame = spark.range(5)
    
    result = frame.withColumn(
        "squared",
        frame["id"] * frame["id"]
    )
    
    result.show()
    要运行 Spark SQL,可以使用以下命令:
    spark.sql(
        "SELECT id, id * id AS squared FROM range(5)"
    ).show()

    查询自己的表时,请使用适当的目录和方案。您的身份必须具有访问这些表的权限。

  5. 应用完成后,关闭 Spark 会话:
    spark.stop()

Spark Connect 故障排除

提供的表列出了在配置到 Oracle AI Data Platform 的 Spark Connect 连接时可能遇到的常见问题,并提供了潜在原因。

问题 要检查的内容
应用程序无法连接 确认集群处于活动状态,并且您的环境可以访问端口 443 上的网关主机名。
验证成功 检查 OCI 配置文件路径、概要信息名称和身份证明。刷新过期的会话身份证明。
授权失败或找不到资源 检查主机名和群集密钥。确认租户启用和使用集群的权限。
查询无法访问表 检查目录、方案和表名称,并确认已验证身份有权访问数据。
Python 报告缺少 pyspark 或 oci 模块 安装提供的依赖项并使用 .venv/bin/python 运行示例。
Python 加载一个意外的 Spark 版本 将所记录的命令与 PYTHONPATH 一起使用,并删除 SPARK_HOME。
Java 报告缺少依赖项或不兼容的库 按照 Java 包随附的设置说明操作,并使用其指定的相关项版本。