Databricks JDBC 驱动程序 (OSS)

重要

此驱动程序目前以公共预览版提供,尚未提供开源版本。

Databricks 提供了一个开源软件 (OSS) JDBC 驱动程序,可用于通过 Java Database Connectivity (JDBC) 将 DataGripDBeaverSQL Workbench/J 等工具连接到 Azure Databricks,这是用于访问数据库管理系统的行业标准规范。

此驱动程序已实现 JDBC API,并提供核心功能,包括 OAuth、Cloud Fetch 以及 Unity Catalog 卷引入等功能。 它运行本机查询模式并支持本机参数化查询,并且可以使用语句执行 API(提供有利的查询结果保留功能)或 Thrift 运行。

本文提供有关安装和使用 Databricks JDBC 驱动程序 (OSS) 的信息。 有关非 OSS Databricks JDBC 驱动程序的信息,请参阅 Databricks JDBC 驱动程序

要求

若要使用 Databricks JDBC 驱动程序 (OSS),必须满足以下要求:

  • Java Runtime Environment (JRE) 11.0 或更高版本。 JRE 11、17 和 21 支持 CI 测试。

安装驱动程序

Databricks JDBC 驱动程序 (OSS) 在 Maven 存储库中发布。 最新版本为 0.9.1-oss

若要安装驱动程序,可以执行以下任一操作:

  • 对于 Maven 项目,将以下依赖项添加到项目的 pom.xml 文件中,以指示 Maven 自动下载具有指定版本的 JDBC 驱动程序:

    <dependency>
      <groupId>com.databricks</groupId>
      <artifactId>databricks-jdbc</artifactId>
      <version>0.9.1-oss</version>
      <scope>runtime</scope>
    </dependency>
    
  • 对于 Gradle 项目,将以下依赖项添加到项目的生成文件中,以指示 Gradle 自动下载具有指定版本的 JDBC 驱动程序:

    implementation 'com.databricks:databricks-jdbc:0.9.1-oss'
    

要查看其他项目类型的依赖项语法,并获取 Databricks JDBC 驱动程序 (OSS) 的最新版本号,请参阅 Maven 存储库

配置连接 URL

若要使用 JDBC 驱动程序连接到 Azure Databricks 工作区,你需要指定一个 JDBC 连接 URL,其中包括各种连接设置,例如你的 Azure Databricks 工作区的服务器主机名、计算资源设置和用于连接到工作区的身份验证凭据。

可以在 JDBC 连接 URL 上设置这些属性的值,设置并将其传递到 DriverManager.getConnection 方法,或结合两者。 请参阅提供程序的文档,了解如何最好地使用特定应用、客户端、SDK、API 或 SQL 工具进行连接。

JDBC 连接 URL 必须采用以下格式。 属性不区分大小写。

jdbc:databricks://<server-hostname>:<port>/<schema>;[property1]=[value];[property2]=[value];...

或者,使用 java.util.Properties 类或组合指定设置:

String url = "jdbc:databricks://<server-hostname>:<port>/<schema>";
Properties properties = new java.util.Properties();
properties.put("<property1>", "<value1");
properties.put("<property2>", "<value2");
// ...
Connection conn = DriverManager.getConnection(url, properties);
String url = "jdbc:databricks://<server-hostname>:<port>/<schema>;[property1]=[value];[property2]=[value];";
Connection conn = DriverManager.getConnection(url, "token", "12345678901234667890abcdabcd");

下表描述了连接 URL。 有关其他属性(包括身份验证属性)的信息,请参阅以下部分。 URL 元素和属性不区分大小写。

URL 元素或属性 说明
<server-hostname> Azure Databricks 计算资源的服务器主机名值。
<port> Azure Databricks 计算资源的端口值。 默认值为 443
<schema> 架构的名称。 此外,你还可以设置 ConnSchema 属性。 请参阅连接属性
httpPath Azure Databricks 计算资源的 HTTP 路径值。 连接器将 httpPath 值追加到连接 URL 中指定的主机和端口,形成要连接的 HTTP 地址。 例如,若要连接到 HTTP 地址 http://localhost:10002/cliservice,请使用以下连接 URL:jdbc:databricks://localhost:10002;httpPath=cliservice

若要获取 Azure Databricks 群集的 JDBC 连接 URL,请执行以下操作:

  1. 登录到你的 Azure Databricks 工作区。
  2. 在边栏中,单击“计算”,然后单击目标群集的名称。
  3. 在“配置”选项卡上,展开“高级选项”。
  4. 单击“JDBC/ODBC”选项卡
  5. 复制 JDBC URL 以用作 JDBC 连接 URL,或从“服务器主机名”、“端口”和“HTTP 路径”字段中的值构造 URL。

若要获取 Databricks SQL 仓库的 JDBC 连接 URL,请执行以下操作:

  1. 登录到你的 Azure Databricks 工作区。
  2. 在边栏中,单击“SQL 仓库”,然后单击目标仓库的名称。
  3. 单击“连接详细信息”选项卡。
  4. 复制 JDBC URL 以用作 JDBC 连接 URL,或从“服务器主机名”、“端口”和“HTTP 路径”字段中的值构造 URL。

对驱动程序进行身份验证

可以使用以下身份验证机制之一对 JDBC 驱动程序连接进行身份验证:

OAuth 用户到计算机 (U2M) 身份验证

JDBC 驱动程序支持 OAuth 用户到计算机 (U2M) 身份验证,使用实时人工登录和同意对目标 Azure Databricks 用户帐户进行身份验证。 这也称为基于浏览器的 OAuth 身份验证。

Azure Databricks 已为客户了创建 OAuth 客户端 ID databricks-sql-jdbc。 这也是 JDBC 驱动程序中使用的默认 OAuth 客户端 ID。 若要配置 OAuth U2M 身份验证,只需将以下属性添加到现有的 JDBC 连接 URL 或 java.util.Properties 对象:

属性 Value
AuthMech 11
Auth_Flow 2

OAuth 计算机到计算机 (M2M) 身份验证

JDBC 驱动程序支持使用 Azure Databricks 服务主体进行 OAuth 计算机到计算机 (M2M) 身份验证。 这也称为 OAuth 2.0 客户端凭据身份验证。 请参阅使用服务主体向 Azure Databricks 进行身份验证 (OAuth M2M)

若要配置 OAuth M2M 或 OAuth 2.0 客户端凭据身份验证:

  1. 创建 Microsoft Entra ID 托管服务主体,然后将其分配给 Azure Databricks 帐户和工作区。 有关详细信息,请参阅管理服务主体

    重要

    Databricks JDBC 驱动程序 (OSS) 支持用于 OAuth M2M 或 OAuth 2.0 客户端凭据身份验证的 Azure Databricks OAuth 机密。 不支持 Microsoft Entra ID 机密。

  2. 为服务主体创建 Azure Databricks OAuth 机密。 若要执行此操作,请参阅手动生成和使用 OAuth M2M 身份验证的访问令牌

  3. 授予服务主体对群集或仓库的访问权限。 请参阅计算权限管理 SQL 仓库

将以下属性添加到你现有的 JDBC 连接 URL 或 java.util.Properties 对象:

属性 Value
AuthMech 11
Auth_Flow 1
OAuth2ClientID 服务主体的“应用程序(客户端)ID”值
OAuth2Secret 服务主体的 Azure Databricks OAuth 机密。 (OAuth M2M 或 OAuth 2.0 客户端凭据身份验证不支持 Microsoft Entra ID 机密。)

Azure Databricks 个人访问令牌

若要使用 Azure Databricks 个人访问令牌对 JDBC 驱动程序连接进行身份验证,请将以下属性添加到你的 JDBC 连接 URL 或 java.util.Properties 对象:

属性 Value
AuthMech 3
user token,字符串形式。
PWDpassword 你的 Azure Databricks 个人访问令牌值,字符串形式。

连接属性

JDBC 驱动程序支持以下额外的连接属性。 属性不区分大小写。

properties 默认值 说明
AuthMech 必须 身份验证机制,其中 3 指定机制是 Azure Databricks 个人访问令牌,11 指定机制为 OAuth 2.0 令牌。 每个机制都需要额外属性。 请参阅对驱动程序进行身份验证
Auth_Flow 0 驱动程序连接的 OAuth2 身份验证流。 如果 AuthMech11,则此属性是必需项。
SSL 1 连接器是否通过启用了 SSL 的套接字与 Spark 服务器通信。
ConnCatalogcatalog SPARK 要使用的默认目录的名称。
ConnSchemaschema default 要使用的默认架构的名称。 可以通过将 URL 中的 <schema> 替换为要使用的架构的名称或将 ConnSchema 属性设置为要使用的架构的名称来指定它。
ProxyAuth 0 如果设置为 1,驱动程序将使用代理身份验证用户和密码,由 ProxyUIDProxyPwd 表示。
ProxyHost null 一个字符串,表示当 UseProxy 也设置为 1 时要使用的代理主机的名称。
ProxyPort null 一个整数,表示当 UseProxy 也设置为 1 时要使用的代理端口的数目。
ProxyUID null 一个字符串,表示当 ProxyAuthUseProxy 也设置为 1 时用于代理身份验证的用户名。
ProxyPwd null 一个字符串,表示当 ProxyAuthUseProxy 也设置为 1 时用于代理身份验证的密码。
UseProxy 0 如果设置为 1,驱动程序将使用提供的代理设置(例如:ProxyAuthProxyHostProxyPortProxyPwdProxyUID)。
UseSystemProxy 0 如果设置为 1,驱动程序将使用已在系统级别设置的代理设置。 如果在连接 URL 中设置了任何其他代理属性,则这些额外的代理属性将替代已在系统级别设置的属性。
UseCFProxy 0 如果设置为 1,则驱动程序将使用云提取代理设置(如果已提供这些设置),否则将使用常规代理。
CFProxyAuth 0 如果设置为 1,驱动程序将使用代理身份验证用户和密码,由 CFProxyUIDCFProxyPwd 表示。
CFProxyHost null 一个字符串,表示当 UseCFProxy 也设置为 1 时要使用的代理主机的名称。
CFProxyPort null 一个整数,表示当 UseCFProxy 也设置为 1 时要使用的代理端口的数目。
CFProxyUID null 一个字符串,表示当 CFProxyAuthUseCFProxy 也设置为 1 时用于代理身份验证的用户名。
CFProxyPwd null 一个字符串,表示当 CFProxyAuthUseCFProxy 也设置为 1 时用于代理身份验证的密码。
AsyncExecPollInterval 200 每次轮询异步查询执行状态之间的时间(以毫秒为单位)。 异步是指用于对 Spark 执行查询的 RPC 调用是异步的。 这并不意味着支持 JDBC 异步操作。
UserAgentEntry browser 要包含在 HTTP 请求中的 User-Agent 条目。 此值采用以下格式:[ProductName]/[ProductVersion] [Comment]
UseThriftClient 0 JDBC 驱动程序是否应该使用 Thrift 客户端连接到通用群集。 默认值适用于 SQL 仓库。

SQL 配置属性

JDBC 驱动程序支持以下 SQL 配置属性。 配置参数中也介绍了这些参数。 属性不区分大小写。

properties 默认值 说明
ansi_mode TRUE 是否对某些函数和强制转换规则启用严格的 ANSI SQL 行为。
enable_photo TRUE 是否启用 Photon 矢量化查询引擎。
legacy_time_parser_policy EXCEPTION 用于分析和设置日期和时间戳格式的方法。 有效值为:EXCEPTIONLEGACYCORRECTED
max_file_partition_bytes 128m 从基于文件的源读取时,要打包到单个分区的最大字节数。 此设置可以是任何正整数,并且可以选择包含诸如 b(字节)、kkb(1024 字节)之类的度量值。
read_only_external_metastore false 控制外部元存储是否被视为只读。
statement_timeout 172800 设置 0 到 172800 秒之间的 SQL 语句超时。
timezone UTC 设置本地时区。 区域 ID 格式为 area/city,例如 America/Los_Angeles,或区域偏移格式为 (+|-)HH、(+|-)HH:mm 或 (+|-)HH:mm:ss,例如 -08、+01:00 或 -13:33:33。 此外,支持使用 UTC 作为 +00:00 的别名
use_cached_result true Databricks SQL 是否缓存并尽可能重复使用结果。

日志记录属性

JDBC 驱动程序支持以下日志记录属性。 属性不区分大小写。

properties 默认值 说明
LogLevel 4 日志记录级别,值为 0 到 6:

* 0:禁用所有日志记录。
* 1:在 FATAL 级别启用日志记录,这会记录导致连接器中止的非常严重的错误事件。
* 2:在 ERROR 级别启用日志记录,这会记录可能仍允许连接器继续运行的错误事件。
* 3:在 WARNING 级别启用日志记录,这会记录在未执行操作时可能导致错误的事件。
* 4:在 INFO 级别启用日志记录,这会记录描述连接器进度的常规信息。
* 5:在 DEBUG 级别启用日志记录,这会记录对调试连接器有用的详细信息。
* 6:在 TRACE 级别启用日志记录,这会记录所有连接器活动。

使用此属性在连接器中启用或禁用日志记录,并指定日志文件中包含的详细信息量。
LogPath logs/application.log 启用日志记录时连接器保存日志文件的文件夹的完整路径,字符串格式。 如果 LogPath 值无效,连接器会将记录的信息发送到标准输出流 (System.out)。

示例:使用 JDBC 驱动程序运行查询

以下示例演示如何使用 JDBC 驱动程序通过 Azure Databricks 计算资源运行 Databricks SQL 查询。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Properties;

public class DatabricksJDBCExample {

    public static void main(String[] args) {

        Class.forName("com.databricks.client.jdbc.Driver");

        // Set JDBC URL properties
        String jdbcUrl = "jdbc:databricks://dbc-a1b2345c-d6e7.cloud.databricks.com:443";
        Properties connectionProperties = new Properties();
        connectionProperties.put("httpPath", "sql/protocolv1/o/123456780012345/0123-123450-z000pi22");
        connectionProperties.put("ssl", "1");

        // Set authentication properties (personal access token)
        connectionProperties.put("AuthMech", "3");
        connectionProperties.put("user", "token");
        connectionProperties.put("password", "12345678901234667890abcdabcd");

        // Set logging properties
        connectionProperties.put("logPath", "logs/myapplication.log");

        // Establish connection and execute query
        try (Connection connection = DriverManager.getConnection(jdbcUrl, connectionProperties);
             Statement statement = connection.createStatement();
             ResultSet resultSet = statement.executeQuery("SELECT * FROM samples.nyctaxi.trips")) {

            // Get metadata and column names
            ResultSetMetaData metaData = resultSet.getMetaData();
            String[] columns = new String[metaData.getColumnCount()];
            for (int i = 0; i < columns.length; i++) {
                columns[i] = metaData.getColumnName(i + 1);
            }

            // Process and print the result set
            while (resultSet.next()) {
                System.out.print("Row " + resultSet.getRow() + "=[");
                for (int i = 0; i < columns.length; i++) {
                    if (i != 0) {
                        System.out.print(", ");
                    }
                    System.out.print(columns[i] + "='" + resultSet.getObject(i + 1) + "'");
                }
                System.out.println("]");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

其他资源