Condividi tramite


Connettere Python e pyodbc ad Azure Databricks

È possibile connettersi dal codice Python locale tramite ODBC ai dati in un cluster Azure Databricks o sql warehouse. A tale scopo, è possibile usare il modulo pyodbcdi codice Python open source .

Seguire queste istruzioni per installare, configurare e usare pyodbc.

Per altre informazioni su pyodbc, vedere il wiki pyodbc.

Nota

Databricks offre il connettore SQL di Databricks per Python come alternativa a pyodbc. Il connettore SQL di Databricks per Python è più semplice da configurare e usare e include un set più affidabile di costrutti di codifica, rispetto pyodbca . Tuttavia pyodbc , può avere prestazioni migliori quando si recuperano i risultati delle query superiori a 10 MB.

Queste istruzioni sono state testate con il driver ODBC di Databricks 2.7.5, pyodbc 5.0.1 e unixODBC 2.3.12.

Requisiti

Passaggio 1: Scaricare, installare e configurare il software

In questo passaggio si scarica e si installa il driver ODBC di Databricks, il unixodbc pacchetto e il pyodbc modulo. Il pyodbc modulo richiede il unixodbc pacchetto in Unix, Linux e macOS. È anche possibile configurare un nome origine dati ODBC (DSN) per l'autenticazione con e la connessione al cluster o al data warehouse SQL.

  1. Scaricare e installare il driver ODBC di Databricks e configurare un DSN ODBC per il sistema operativo.
  2. Per Unix, Linux e macOS, installare il unixodbc pacchetto: dal terminale usare Homebrew per eseguire il comando brew install unixodbc. Per altre informazioni, vedere unixodbc nel sito Web Homebrew.
  3. Installare il pyodbc modulo: dal terminale o dal prompt dei comandi, usare pip per eseguire il comando pip install pyodbc. Per altre informazioni, vedere pyodbc nel sito Web PyPI e Installare nel wiki pyodbc.

Passaggio 2: Testare la configurazione

In questo passaggio si scrive ed esegue codice Python per usare il cluster Azure Databricks o Databricks SQL Warehouse per eseguire query sulla trips tabella nello samples schema del nyctrips catalogo e visualizzare i risultati.

  1. Creare un file denominato pyodbc-demo.py con il contenuto seguente. Sostituire <dsn-name> con il nome del DSN ODBC creato in precedenza, salvare il file e quindi eseguire il file con l'interprete Python.

    import pyodbc
    
    # Connect to the Databricks cluster by using the
    # Data Source Name (DSN) that you created earlier.
    conn = pyodbc.connect("DSN=<dsn-name>", autocommit=True)
    
    # Run a SQL query by using the preceding connection.
    cursor = conn.cursor()
    cursor.execute(f"SELECT * FROM samples.nyctaxi.trips")
    
    # Print the rows retrieved from the query.
    for row in cursor.fetchall():
      print(row)
    
  2. Per velocizzare l'esecuzione del codice, avviare il cluster che corrisponde all'impostazione HTTPPath nel DSN.

  3. Eseguire il file con l'interprete pyodbc-demo.py Python. Vengono visualizzate informazioni sulle righe della tabella.

Passaggi successivi

  • Per eseguire il codice di test python in un cluster o in un data warehouse SQL diverso, creare un DSN diverso e passare <dsn-name> al nome del DSN.
  • Per eseguire il codice di test python con una query SQL diversa, modificare la stringa di execute comando.

Uso di una connessione senza DSN

In alternativa all'uso di un nome DSN, è possibile specificare le impostazioni di connessione inline. L'esempio seguente illustra come usare un stringa di connessione senza DSN per l'autenticazione del token di accesso personale di Azure Databricks. In questo esempio si presuppone che siano presenti le variabili di ambiente seguenti:

Per impostare le variabili di ambiente, si veda la documentazione relativa al sistema operativo Windows utilizzato.

import pyodbc
import os

conn = pyodbc.connect(
  "Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
  f"Host={os.getenv('DATABRICKS_HOST')};" +
  "Port=443;" +
  f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
  "SSL=1;" +
  "ThriftTransport=2;" +
  "AuthMech=3;" +
  "UID=token;" +
  f"PWD={os.getenv('DATABRICKS_TOKEN')}",
  autocommit = True
)

# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")

# Print the rows retrieved from the query.
for row in cursor.fetchall():
  print(row)

L'esempio seguente usa l'autenticazione basata su browser OAuth da utente a computer (U2M) o OAuth 2.0 anziché un token di accesso personale di Azure Databricks. In questo esempio si presuppone che siano già state impostate le variabili di ambiente e DATABRICKS_HTTP_PATH precedentiDATABRICKS_SERVER_HOSTNAME.

import pyodbc
import os

conn = pyodbc.connect(
  "Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
  f"Host={os.getenv('DATABRICKS_HOST')};" +
  "Port=443;" +
  f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
  "SSL=1;" +
  "ThriftTransport=2;" +
  "AuthMech=11;" +
  "Auth_Flow=2;" +
  "PWD=1234567",
  autocommit = True
)

# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")

# Print the rows retrieved from the query.
for row in cursor.fetchall():
  print(row)

Nell'esempio seguente viene usata l'autenticazione delle credenziali client OAuth da computer a computer (M2M) o OAuth 2.0. In questo esempio si presuppone che siano già state impostate le variabili di ambiente e DATABRICKS_HTTP_PATH precedentiDATABRICKS_SERVER_HOSTNAME, nonché le variabili di ambiente seguenti:

  • Impostare ARM_CLIENT_ID sul valore ID applicazione (client) dell'entità servizio.
  • Impostare DATABRICKS_OAUTH_SECRET sul valore del segreto OAuth dell'entità servizio. I segreti microsoft Entra ID non sono supportati per l'autenticazione delle credenziali client OAuth M2M o OAuth 2.0 con il driver ODBC di Databricks.

Per altre informazioni, vedere Autenticazione da computer a computer OAuth (M2M).

import pyodbc
import os

conn = pyodbc.connect(
  "Driver=/Library/simba/spark/lib/libsparkodbc_sb64-universal.dylib;" +
  f"Host={os.getenv('DATABRICKS_HOST')};" +
  "Port=443;" +
  f"HTTPPath={os.getenv('DATABRICKS_HTTP_PATH')};" +
  "SSL=1;" +
  "ThriftTransport=2;" +
  "AuthMech=11;" +
  "Auth_Flow=1;" +
  f"Auth_Client_ID={os.getenv('ARM_CLIENT_ID')};" +
  f"Auth_Client_Secret={os.getenv('DATABRICKS_OAUTH_SECRET')}",
  autocommit = True
)

# Run a SQL query by using the preceding connection.
cursor = conn.cursor()
cursor.execute("SELECT * FROM samples.nyctaxi.trips")

# Print the rows retrieved from the query.
for row in cursor.fetchall():
  print(row)

Risoluzione dei problemi

Questa sezione risolve i problemi comuni relativi all'uso pyodbc con Databricks.

Errore di decodifica Unicode

Problema: viene visualizzato un messaggio di errore simile al seguente:

<class 'pyodbc.Error'> returned a result with an error set
Traceback (most recent call last):
File "/Users/user/.pyenv/versions/3.7.5/lib/python3.7/encodings/utf_16_le.py", line 16, in decode
return codecs.utf_16_le_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 2112-2113: illegal UTF-16 surrogate

Causa: esiste un problema nella pyodbc versione 4.0.31 o successiva che potrebbe manifestarsi con tali sintomi durante l'esecuzione di query che restituiscono colonne con nomi lunghi o un messaggio di errore lungo. Il problema è stato risolto da una versione più recente di pyodbc.

Soluzione: aggiornare l'installazione di pyodbc alla versione 4.0.32 o successiva.

Risoluzione dei problemi generali

Vedere Problemi nel repository mkleehammer/pyodbc su GitHub.