Databricks JDBC ドライバー (OSS)

重要

このドライバーはパブリック プレビュー段階であり、オープン ソースとしてはまだ利用できません。

Databricks には、DataGripDBeaverSQL Workbench/J などのツールを JDBC 経由で Azure Databricks に接続できるオープン ソース ソフトウェア (OSS) JDBC ドライバーが用意されています。JDBC (Java Database Connectivity) は、データベース管理システムにアクセスする手段の業界標準仕様です。

このドライバーは JDBC API を実装しており、OAuth、Cloud Fetch、Unity Catalog ボリューム インジェストなどの機能を含むコア機能を提供します。 これはネイティブ クエリ モードを実行し、ネイティブのパラメーター化クエリをサポートし、有益なクエリ結果保持機能を提供する Statement Execution API または Thrift を使用して実行できます。

この記事では、Databricks JDBC ドライバー (OSS) のインストールと使用に関する情報を提供します。 OSS ではない Databricks JDBC ドライバーの詳細については、Databricks JDBC ドライバーの説明を参照してください。

要件

Databricks JDBC ドライバー (OSS) を使用するには、以下の要件を満たす必要があります。

  • Java Runtime Environment (JRE) 11.0 以降。 CI テストは、JRE 11、17、および 21 でサポートされています。
  • Databricks SQL 2024.30 以降

ドライバーをインストールする

Databricks JDBC ドライバー (OSS) は Maven Repository で公開されています。 最新バージョンは 0.9.0-oss です。

ドライバーをインストールするには、以下のいずれかの操作を行います。

  • Maven プロジェクトの場合は、指定したバージョンの JDBC ドライバーを自動的にダウンロードすることを Maven に指示するために、プロジェクトの pom.xml ファイルに以下の依存関係を追加します。

    <dependency>
      <groupId>com.databricks</groupId>
      <artifactId>databricks-jdbc</artifactId>
      <version>0.9.0-oss</version>
      <scope>runtime</scope>
    </dependency>
    
  • Gradle プロジェクトの場合は、指定したバージョンの JDBC ドライバーを自動的にダウンロードすることを Gradle に指示するために、プロジェクトのビルド ファイルに以下の依存関係を追加します。

    implementation 'com.databricks:databricks-jdbc:0.9.0-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 パス値。 コネクタは、接続 URL で指定されたホストとポートに httpPath 値を付加することで、接続先の HTTP アドレスを形成します。 たとえば、HTTP アドレス http://localhost:10002/cliservice に接続するための接続 URL は次のようなものになります: jdbc:databricks://localhost:10002;AuthMech=3;httpPath=cliservice;UID=token;PWD=password123;

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 ドライバー接続の認証には、以下のいずれかの認証メカニズムを使用できます。

Azure Databricks 個人用アクセス トークン

Azure Databricks 個人用アクセス トークン を使用して JDBC ドライバー接続を認証する場合は、JDBC 接続 URL または java.util.Properties オブジェクトに以下のプロパティを追加します。

プロパティ
AuthMech 3
UID または user token 値 (文字列)。
PWD または password Azure Databricks 個人用アクセス トークン値 (文字列)。

OAuth マシン間 (M2M) 認証

この JDBC ドライバーは、Microsoft Entra ID サービス プリンシパルの OAuth マシン間 (M2M) 認証をサポートしています。 これは、OAuth 2.0 ''クライアント資格情報'' 認証とも呼ばれます。

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 オブジェクトに追加します。

プロパティ
AuthMech 11
Auth_Flow 1
OAuth2ClientID サービス プリンシパルのアプリケーション (クライアント) ID 値。
OAuth2Secret サービス プリンシパルの Azure Databricks OAuth シークレット。 (Microsoft Entra ID シークレットは、OAuth M2M または OAuth 2.0 クライアント資格情報認証ではサポートされていません。)

接続のプロパティ

この JDBC ドライバーでは、以下に示す追加の接続プロパティがサポートされています。 プロパティの大文字と小文字は区別されません。

プロパティ 既定値 説明
AuthMech 必須 認証メカニズム。3 はメカニズムが Azure Databricks 個人用アクセス トークンであること、11 はメカニズムが OAuth 2.0 トークンであることを示します。 いずれのメカニズムにも、追加のプロパティが必要です。 ドライバーの認証に関する説明を参照してください。
Auth_Flow 0 ドライバー接続の OAuth2 認証フロー。 このプロパティは、AuthMech11 である場合に必須です。
SSL 1 コネクタが Spark サーバーとの通信を SSL 対応ソケット経由で行うかどうか。
ConnCatalog または catalog SPARK 使う既定のカタログの名前。
ConnSchema または schema default 使う既定のスキーマの名前。 これを指定するには、使用するスキーマの名前で URL 内の <schema> を置き換えるか、ConnSchema プロパティに使用するスキーマの名前を設定します。
ProxyAuth 0 1 に設定した場合、ドライバーは、ProxyUIDProxyPwd で表されたプロキシ認証ユーザーとパスワードを使用します。
ProxyHost null UseProxy1 に設定されている場合に使用する、プロキシ ホストの名前を表す文字列。
ProxyPort null UseProxy1 に設定されている場合に使用する、プロキシ ポートの番号を表す整数。
ProxyUID null ProxyAuthUseProxy1 に設定されている場合に使用する、プロキシ認証用のユーザー名を表す文字列。
ProxyPwd null ProxyAuthUseProxy1 に設定されている場合に使用する、プロキシ認証用のパスワードを表す文字列。
UseProxy 0 1 に設定した場合、ドライバーは、指定されたプロキシ設定を使用します (例: ProxyAuthProxyHostProxyPortProxyPwdProxyUID)。
UseSystemProxy 0 1 に設定した場合、ドライバーは、システム レベルで設定されたプロキシ設定を使用します。 接続 URL 内に追加のプロキシ プロパティが設定されている場合、それらの追加のプロキシ プロパティは、システム レベルで設定されたプロキシ プロパティよりも優先されます。
UseCFProxy 0 1 に設定した場合、ドライバーは、クラウド フェッチ プロキシ設定が提供されていればそれを使用し、そうでない場合は通常のプロキシを使用します。
CFProxyAuth 0 1 に設定した場合、ドライバーは、CFProxyUIDCFProxyPwd で表されたプロキシ認証ユーザーとパスワードを使用します。
CFProxyHost null UseCFProxy1 に設定されている場合に使用する、プロキシ ホストの名前を表す文字列。
CFProxyPort null UseCFProxy1 に設定されている場合に使用する、プロキシ ポートの番号を表す整数。
CFProxyUID null CFProxyAuthUseCFProxy1 に設定されている場合に使用する、プロキシ認証用のユーザー名を表す文字列。
CFProxyPwd null CFProxyAuthUseCFProxy1 に設定されている場合に使用する、プロキシ認証用のパスワードを表す文字列。
AsyncExecPollInterval 200 非同期クエリ実行ステータスを確認するポーリング間隔の時間 (ミリ秒単位)。 ここでいう非同期は、Spark に対するクエリ実行のための RPC 呼び出しが非同期に処理されるという事実を指します。 JDBC 非同期操作のサポートを意味するものではありません。
UserAgentEntry browser HTTP 要求に含められる User-Agent エントリ。 この値の形式は次のとおりです: [ProductName]/[ProductVersion] [Comment]

SQL 構成プロパティ

この JDBC ドライバーでは、以下に示す SQL 構成プロパティがサポートされています。 これらについては、設定パラメータの説明も参照してください。 プロパティの大文字と小文字は区別されません。

プロパティ 既定値 説明
ansi_mode TRUE 特定の関数とキャスト ルールに関して、厳密な ANSI SQL 動作を有効にするかどうか。
enable_photo TRUE Photon ベクター化クエリ エンジンを有効にするかどうか。
legacy_time_parser_policy EXCEPTION 日付とタイムスタンプの解析と書式設定に使用するメソッド。 有効な値は、EXCEPTIONLEGACYCORRECTED です。
max_file_partition_bytes 128m ファイル ベースのソースからの読み取り時に 1 つのパーティションに取り込める最大バイト数です。 この設定には任意の正の整数を使用でき、オプションとして、単位 b (バイト)、k または kb (1024 バイト) などを付けることもできます。
read_only_external_metastore false 外部メタストアを読み取り専用として扱うかどうかを制御します。
statement_timeout 172800 SQL ステートメントのタイムアウトを 0 から 172,800 秒までの範囲で設定します。
timezone UTC ローカル タイムゾーンを設定します。 area/city 形式の地域 ID。例: America/Los_Angeles、またはゾーン オフセット形式 (+
use_cached_result true 可能な限り Databricks SQL が結果をキャッシュして再利用するかどうか。

ログのプロパティ

この JDBC ドライバーでは、以下のログ記録プロパティがサポートされています。 プロパティの大文字と小文字は区別されません。

プロパティ 既定値 説明
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 ドライバーを使用したクエリ実行

以下の例は、Azure Databricks コンピューティング リソースを使用する Databricks SQL クエリを、JDBC ドライバーを使用して実行する方法を示しています。

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();
        }
    }
}

その他のリソース