Condividi tramite


Driver ODBC di Databricks (OSS)

Importante

Questo driver è disponibile in anteprima pubblica e non è ancora disponibile come open source.

Databricks fornisce un driver JDBC (OSS) software open source che consente di connettere strumenti come DataGrip, DBeaver e SQL Workbench/J ad Azure Databricks tramite JDBC (Java Database Connectivity), una specifica standard del settore per l'accesso ai sistemi di gestione dei database.

Questo driver ha implementato le API JDBC e offre funzionalità di base, tra cui OAuth, Cloud Fetch e funzionalità come l'inserimento di volumi del catalogo Unity. Esegue la modalità query nativa e supporta query con parametri nativi e può essere eseguita usando le API di esecuzione delle istruzioni, che fornisce la funzionalità di conservazione dei risultati delle query vantaggiosa o Thrift.

Questo articolo fornisce informazioni sull'installazione e l'uso di Databricks JDBC Driver (OSS). Per informazioni sul driver JDBC di Databricks non OSS, vedere Driver JDBC di Databricks.

Requisiti

Per usare databricks JDBC Driver (OSS), è necessario soddisfare i seguenti requisiti:

  • Java Runtime Environment (JRE) 11.0 o versione successiva. I test CI sono supportati in JRE 11, 17 e 21.

Nota

A seguito di una modifica in JDK 16 che ha causato un problema di compatibilità con la libreria Apache Arrow usata dal driver JDBC, possono verificarsi errori di runtime quando si usa il driver JDBC con JDK 16 o versione successiva. Per evitare questi errori, riavviare l'applicazione o il driver usando l'opzione di comando JVM seguente:

--add-opens=java.base/java.nio=org.apache.arrow.memory.core ALL-UNNAMED

Installare il driver

Il driver JDBC di Databricks (OSS) viene pubblicato nel repository Maven. La versione più recente è 0.9.6-oss.

Per installare il driver, è possibile eseguire una delle seguenti operazioni:

  • Per i progetti Maven, aggiungere la dipendenza seguente al file pom.xml del progetto per indicare a Maven di scaricare automaticamente il driver JDBC con la versione specificata:

    <dependency>
      <groupId>com.databricks</groupId>
      <artifactId>databricks-jdbc</artifactId>
      <version>0.9.6-oss</version>
      <scope>runtime</scope>
    </dependency>
    
  • Per i progetti Gradle , aggiungere la dipendenza seguente al file di compilazione del progetto per indicare a Gradle di scaricare automaticamente il driver JDBC con la versione specificata:

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

Per visualizzare la sintassi delle dipendenze per altri tipi di progetto e ottenere il numero di versione più recente di Databricks JDBC Driver (OSS), vedere il repository Maven.

Configurare le connessioni URL

Per connettersi all'area di lavoro di Azure Databricks utilizzando il driver JDBC, è necessario specificare un URL di connessione JDBC che includa varie impostazioni di connessione, come il nome host del server dell'area di lavoro di Azure Databricks, le impostazioni della risorsa di calcolo e le credenziali di autenticazione per la connessione all'area di lavoro.

È possibile impostare il valore di queste proprietà nell'URL della connessione JDBC, impostarle e passarle al metodo DriverManager.getConnection o una combinazione dei due metodi. Vedere la documentazione del provider per informazioni su come connettersi usando l'app, il client, l'SDK, l'API o lo strumento SQL specifico.

L'URL di connessione JDBC deve avere il seguente formato. Le proprietà fanno distinzione tra maiuscole e minuscole.

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

In alternativa, specificare le impostazioni usando la classe java.util.Properties o una combinazione:

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");

Gli elementi DELL'URL di connessione sono descritti nella tabella seguente. Per informazioni sulle proprietà aggiuntive, incluse le proprietà di autenticazione, vedere le sezioni seguenti. Gli elementi e le proprietà URL non fanno distinzione tra maiuscole e minuscole.

Elemento o proprietà URL Descrizione
<server-hostname> Valore hostname server della risorsa di calcolo di Azure Databricks.
<port> Il valore della porta della risorsa di calcolo di Azure Databricks. Il valore predefinito è 443.
<schema> Nome dello schema. In alternativa, è possibile impostare la proprietà ConnSchema. Si veda Proprietà di connessione.
httpPath Il valore del percorso HTTP della risorsa di calcolo di Azure Databricks. Il connettore costituisce l'indirizzo HTTP a cui connettersi aggiungendo valore httpPath all'host e alla porta specificata nell'URL di connessione. Ad esempio, per connettersi all'indirizzo HTTP http://localhost:10002/cliservice, usare l'URL di connessione seguente: jdbc:databricks://localhost:10002;httpPath=cliservice

Per ottenere l'URL di connessione JDBC per un cluster Azure Databricks:

  1. Accedere all'area di lavoro di Azure Databricks.
  2. Nella barra laterale fare clic su Ambiente di calcolo, quindi sul nome del cluster di destinazione.
  3. Nella scheda Configurazione espandere Opzioni avanzate.
  4. Fare clic sulla scheda JDBC/ODBC.
  5. Copiare l'URL JDBC da usare come URL di connessione JDBC oppure costruire l'URL dai valori nei ampi Nome host server, Porta e Percorso HTTP.

Per ottenere l'URL di connessione JDBC per un databricks SQL Warehouse:

  1. Accedere all'area di lavoro di Azure Databricks.
  2. Nella barra laterale fare clic su SQL Warehouse, poi sul nome del warehouse di destinazione.
  3. Fare clic sulla scheda Dettagli sulle connessioni.
  4. Copiare l'URL JDBC da usare come URL di connessione JDBC oppure costruire l'URL dai valori nei ampi Nome host server, Porta e Percorso HTTP.

Autenticare il driver

È possibile autenticare la connessione al driver JDBC usando uno dei meccanismi di autenticazione seguenti:

Autenticazione da utente a computer (U2M) OAuth

Il driver JDBC supporta l'autenticazione da utente a computer (U2M) OAuth per l'accesso umano in tempo reale e il consenso per autenticare l'account utente di Databricks di destinazione. Questa operazione è nota anche come autenticazione OAuth basata su browser.

Azure Databricks ha creato l'ID client OAuth databricks-sql-jdbc per i clienti. Si tratta anche dell'ID client OAuth predefinito usato nel driver JDBC. Per configurare l'autenticazione U2M OAuth, è sufficiente aggiungere le proprietà seguenti all'URL o all'oggetto java.util.Properties di connessione JDBC esistente:

Proprietà valore
AuthMech 11
Auth_Flow 2

Autenticazione OAuth da computer a computer (M2M)

Il driver JDBC supporta l'autenticazione da computer a computer (M2M) OAuth usando un'entità servizio di Azure Databricks. Questa operazione è nota anche come autenticazione delle credenziali client OAuth 2.0. Consultare Autenticare l'accesso ad Azure Databricks con un'entità servizio usando OAuth (OAuth M2M).

Per configurare l'autenticazione delle credenziali client OAuth M2M o OAuth 2.0:

  1. Creare un'entità servizio gestita da Microsoft Entra ID e assegnarla agli account e alle aree di lavoro di Azure Databricks. Per ulteriori dettagli, vedere Gestire l'entità servizio.

    Importante

    Databricks JDBC Driver (OSS) supporta i segreti OAuth di Azure Databricks per l'autenticazione delle credenziali client OAuth M2M o OAuth 2.0. I segreti dell'ID Microsoft Entra non sono supportati.

  2. Creare un segreto OAuth di Azure Databricks per l'entità servizio. A tale scopo, si veda Generare e usare manualmente i token di accesso per l'autenticazione OAuth M2M.

  3. Concedere all'entità servizio l'accesso al cluster o al warehouse. Vedere Autorizzazioni di calcolo o Gestire un'istanza di SQL Warehouse.

Aggiungere le proprietà seguenti all'URL o all'oggetto java.util.Properties di connessione JDBC esistente:

Proprietà valore
AuthMech 11
Auth_Flow 1
OAuth2ClientID Valore entità servizio ID (cliente) dell'applicazione.
OAuth2Secret Il segreto OAuth dell'entità servizio di Azure Databricks. (I segreti microsoft Entra ID non sono supportati per l'autenticazione client OAuth M2M o OAuth 2.0.)

Token di accesso personale di Azure Databricks

Per autenticare la connessione al driver JDBC usando un token di accesso personale di Azure Databricks, aggiungere le proprietà seguenti all'URL o all'oggetto java.util.Properties di connessione JDBC:

Proprietà valore
AuthMech 3
user Valore token, come stringa.
PWD oppure password Il valore del token di accesso personale di Azure Databricks, come stringa.

Proprietà di connessione

Le proprietà di connessione aggiuntive seguenti sono supportate dal driver JDBC. Le proprietà fanno distinzione tra maiuscole e minuscole.

Proprietà Default value Descrizione
AuthMech Richiesto Il meccanismo di autenticazione, in cui 3 specifica il meccanismo è un token di accesso personale di Azure Databricks e 11 specifica che il meccanismo è token OAuth 2.0. Per ogni meccanismo sono necessarie proprietà aggiuntive. Si veda Autenticare il driver.
Auth_Flow 0 Flusso di autenticazione OAuth2 per la connessione driver. Questa proprietà è obbligatoria seAuthMech è 11.
SSL 1 Indica se il connettore comunica con il server Spark tramite un socket abilitato per SSL.
ConnCatalog oppure catalog SPARK Il nome del catalogo predefinito da usare.
ConnSchema oppure schema default Il nome dello schema predefinito da usare. Questa opzione può essere specificata sostituendo <schema> nell'URL con il nome dello schema da usare o impostando la proprietà ConnSchema sul nome dello schema da usare.
ProxyAuth 0 Se impostato su 1, il driver usa l'utente e la password di autenticazione proxy, rappresentati da ProxyUID e ProxyPwd.
ProxyHost null Stringa che rappresenta il nome dell'host proxy da usare quando UseProxy è impostato anche su 1.
ProxyPort null Numero intero che rappresenta il numero di porte proxy da usare quando UseProxy è impostato anche su 1.
ProxyUID null Stringa che rappresenta il nome utente da usare per l'autenticazione proxy quando ProxyAuth e UseProxy sono impostati anche su 1.
ProxyPwd null Stringa che rappresenta la password da usare per l'autenticazione proxy quando ProxyAuth e UseProxy sono impostati anche su 1.
UseProxy 0 Se è impostato su 1, il driver usa le impostazioni proxy fornite (ad esempio ProxyAuth, ProxyHost, ProxyPort, ProxyPwd e ProxyUID).
UseSystemProxy 0 Se impostato su 1, il driver usa le impostazioni proxy impostate a livello di sistema. Se nell'URL di connessione sono impostate proprietà proxy aggiuntive, queste proprietà proxy aggiuntive sostituiscono quelle impostate a livello di sistema.
UseCFProxy 0 Se impostato su 1, il driver usa le impostazioni proxy di recupero cloud, se disponibili, in caso contrario usare il proxy normale.
CFProxyAuth 0 Se impostato su 1, il driver usa l'utente e la password di autenticazione proxy, rappresentati da CFProxyUID e CFProxyPwd.
CFProxyHost null Stringa che rappresenta il nome dell'host proxy da usare quando UseCFProxy è impostato anche su 1.
CFProxyPort null Numero intero che rappresenta il numero di porte proxy da usare quando UseCFProxy è impostato anche su 1.
CFProxyUID null Stringa che rappresenta il nome utente da usare per l'autenticazione proxy quando CFProxyAuth e UseCFProxy sono impostati anche su 1.
CFProxyPwd null Stringa che rappresenta la password da usare per l'autenticazione proxy quando CFProxyAuth e UseCFProxy sono impostati anche su 1.
AsyncExecPollInterval 200 Tempo in millisecondi tra ogni polling per lo stato di esecuzione della query asincrona. Asincrona si riferisce al fatto che la chiamata RPC usata per eseguire una query su Spark è asincrona. Non significa che le operazioni asincrone JDBC siano supportate.
UserAgentEntry browser Voce User-Agent da includere nella richiesta HTTP. Questo valore è nel formato seguente: [ProductName]/[ProductVersion] [Comment]
UseThriftClient 0 Indica se il driver JDBC deve usare il client Thrift per connettersi a un cluster all-purpose. Il valore predefinito funziona per SQL warehouse.

Proprietà di configurazione SQL

Le seguenti proprietà di configurazione SQL sono supportate dal driver JDBC. Questi sono descritti anche in Parametri di configurazione. Le proprietà fanno distinzione tra maiuscole e minuscole.

Proprietà Default value Descrizione
ansi_mode TRUE Indica se abilitare un comportamento SQL ANSI rigoroso per determinate funzioni e regole di casting.
enable_photo TRUE Indica se abilitare il motore di query vettorializzato Photon.
legacy_time_parser_policy EXCEPTION Metodi utilizzati per analizzare e formattare date e timestamp. I valori validi sono EXCEPTION, LEGACY e CORRECTED.
max_file_partition_bytes 128m Il numero massimo di byte da impacchettare in una singola partizione quando si legge da fonti basate su file. L'impostazione può essere un numero intero positivo e facoltativamente includere una misura, ad esempio b (byte) k o kb (1024 byte).
read_only_external_metastore false Controlla se un metastore esterno viene considerato di sola lettura.
statement_timeout 172800 Imposta un timeout dell'istruzione SQL compreso tra 0 e 172800 secondi.
timezone UTC Impostare il fuso orario locale. ID area nel formato area/city, ad esempio America/Los_Angeles o offset di zona nel formato (+|-)HH, (+|-)HH:mm o (+|-)HH:mm:ss, ad esempio -08, +01:00 o -13:33:33. Inoltre, UTC è supportato come alias per +00:00
use_cached_result true Indica se Databricks SQL memorizza nella cache e riutilizza i risultati quando possibile.

Proprietà della registrazione

Le seguenti proprietà di registrazione sono supportate dal driver JDBC. Le proprietà fanno distinzione tra maiuscole e minuscole.

Proprietà Default value Descrizione
LogLevel OFF Livello di registrazione, che è un valore compreso tra 0 e 6:

- 0: Disabilita tutte le registrazioni.
- 1: Abilita la registrazione sul livello FATAL, che registra eventi di errore molto gravi che porteranno il connettore ad interrompere l'interruzione.
- 2: Abilita la registrazione a livello di ERRORE, che registra gli eventi di errore che potrebbero comunque consentire al connettore di continuare l'esecuzione.
- 3: Abilita la registrazione a livello di AVVISO, che registra gli eventi che potrebbero generare un errore se non viene eseguita un'azione.
- 4: Abilita la registrazione a livello di INFORMAZIONI, che registra informazioni generali che descrivono lo stato del connettore.
- 5: Abilita la registrazione a livello DEBUG, che registra informazioni dettagliate utili per il debug del connettore.
- 6: Abilita la registrazione sul livello TRACE, che registra tutte le attività del connettore.

Utilizzare questa proprietà per abilitare o disabilitare la registrazione nel connettore e per specificare la quantità di dettagli inclusi nei file di log.
LogPath Per determinare il percorso predefinito per i log, il driver usa il valore impostato per queste proprietà di sistema, in questo ordine di priorità:

1. user.dir
2. java.io.tmpdir
3. La directory corrente, in altre parole .
Percorso completo della cartella in cui il connettore salva i file di log quando la registrazione è abilitata, come stringa. Per assicurarsi che l'URL di connessione sia compatibile con tutte le applicazioni JDBC, eseguire l'escape delle barre rovesciate (\) nel percorso del file digitando un'altra barra rovesciata.

Se il LogPath valore non è valido, il connettore invia le informazioni registrate al flusso di output standard (System.out).
LogFileSize Nessun valore massimo Dimensioni massime consentite del file di log, specificate in MB
LogFileCount Nessun valore massimo Numero massimo di file di log consentiti

Abilitare e configurare la registrazione

Il driver JDBC supporta i framework Simple Logging Facciata per Java (SLF4J) e java.util.logging (JUL). Il driver usa il framework di registrazione JUL per impostazione predefinita.

Per abilitare e configurare la registrazione per il driver JDBC:

  1. Abilitare il framework di registrazione che si vuole usare:

    • Per la registrazione SLF4J, impostare la proprietà -Dcom.databricks.jdbc.loggerImpl=SLF4JLOGGER di sistema e fornire l'implementazione dell'associazione SLF4J (compatibile con SLF4J versione 2.0.13 e successive) e il file di configurazione corrispondente nel classpath.
    • Per la registrazione di JUL, impostare la proprietà -Dcom.databricks.jdbc.loggerImpl=JDKLOGGERdi sistema . Si tratta dell'impostazione predefinita.
  2. Impostare la LogLevel proprietà sul stringa di connessione sul livello di informazioni desiderato da includere nei file di log.

  3. Impostare la LogPath proprietà nel stringa di connessione sul percorso completo della cartella in cui si desidera salvare i file di log.

    Ad esempio, l'URL di connessione seguente abilita il livello di registrazione 6 e salva i file di log nella cartella C:temp:

    jdbc: databricks://localhost:11000;LogLevel=6;LogPath=C:\\temp
    
  4. Riavviare l'applicazione JDBC e riconnettersi al server per applicare le impostazioni.

Esempio: eseguire una query usando il driver JDBC

L'esempio seguente illustra come usare il driver JDBC per eseguire una query SQL di Databricks usando una risorsa di calcolo di Azure Databricks.

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

Risorse aggiuntive