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 pyodbc
di 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 pyodbc
a . 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
- Un computer di sviluppo locale che esegue uno dei seguenti elementi:
- macOS
- Finestre
- Una distribuzione Unix o Linux che supporta
.rpm
o.deb
file
- pip.
- Per Unix, Linux o macOS, Homebrew.
- Un cluster Azure Databricks, un databricks SQL warehouse o entrambi. Per altre informazioni, vedere Informazioni di riferimento sulla configurazione di calcolo e Connettersi a un'istanza di SQL Warehouse.
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.
- Scaricare e installare il driver ODBC di Databricks e configurare un DSN ODBC per il sistema operativo.
- Per Unix, Linux e macOS, installare il
unixodbc
pacchetto: dal terminale usare Homebrew per eseguire il comandobrew install unixodbc
. Per altre informazioni, vedere unixodbc nel sito Web Homebrew. - Installare il
pyodbc
modulo: dal terminale o dal prompt dei comandi, usarepip
per eseguire il comandopip 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.
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)
Per velocizzare l'esecuzione del codice, avviare il cluster che corrisponde all'impostazione
HTTPPath
nel DSN.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:
- Impostare
DATABRICKS_SERVER_HOSTNAME
sul nome dell'istanza dell'area di lavoro, ad esempioadb-1234567890123456.7.azuredatabricks.net
. - Impostare
DATABRICKS_HTTP_PATH
sul valore percorso HTTP per il cluster di destinazione o sql warehouse nell'area di lavoro. Per ottenere il valore del percorso HTTP, vedere Ottenere i dettagli della connessione per una risorsa di calcolo di Azure Databricks. - Impostare
DATABRICKS_TOKEN
sul token di accesso personale di Azure Databricks per l'utente di destinazione. Per creare un token di accesso personale, vedere Token di accesso personale di Azure Databricks per gli utenti dell'area di lavoro.
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.