Dela via


Ansluta Python och pyodbc till Azure Databricks

Du kan ansluta från din lokala Python-kod via ODBC till data i ett Azure Databricks-kluster eller SQL-lager. Om du vill göra detta kan du använda öppen källkod Python-kodmodulen pyodbc.

Följ de här anvisningarna för att installera, konfigurera och använda pyodbc.

Mer information om pyodbcfinns i pyodbc Wiki.

Kommentar

Databricks erbjuder Databricks SQL Connector för Python som ett alternativ till pyodbc. Databricks SQL Connector för Python är enklare att konfigurera och använda och har en mer robust uppsättning kodningskonstruktioner än pyodbc. Men pyodbc kan ha bättre prestanda när du hämtar frågor resultat över 10 MB.

Dessa instruktioner har testats med Databricks ODBC-drivrutinen 2.7.5, pyodbc 5.0.1 och unixODBC 2.3.12.

Krav

  • En lokal utvecklingsdator som kör något av följande:
    • macOS
    • Windows
    • En Unix- eller Linux-distribution som stöder .rpm eller .deb filer
  • pip.
  • För Unix, Linux eller macOS, Homebrew.
  • Ett Azure Databricks-kluster, ett Databricks SQL-lager eller båda. Mer information finns i Referens för beräkningskonfiguration och Anslut till ett SQL-lager.

Steg 1: Ladda ned, installera och konfigurera programvara

I det här steget laddar du ned och installerar Databricks ODBC-drivrutinen, unixodbc paketet och modulen pyodbc . (Modulen pyodbc unixodbc kräver paketet på Unix, Linux och macOS.) Du konfigurerar också ett ODBC-namn (DSN) för att autentisera med och ansluta till ditt kluster eller SQL-lager.

  1. Ladda ned och installera Databricks ODBC-drivrutinen och konfigurera ett ODBC DSN för operativsystemet.
  2. För Unix, Linux och macOS installerar du unixodbc paketet: från terminalen använder du Homebrew för att köra kommandot brew install unixodbc. Mer information finns i unixodbc på Homebrews webbplats.
  3. Installera modulen pyodbc : från terminalen eller kommandotolken använder du pip för att köra kommandot pip install pyodbc. Mer information finns i pyodbc på PyPI-webbplatsen och Installera i pyodbc Wiki.

Steg 2: Testa konfigurationen

I det här steget skriver och kör du Python-kod för att använda ditt Azure Databricks-kluster eller Databricks SQL-lager för att fråga trips tabellen i samples katalogens nyctrips schema och visa resultatet.

  1. Skapa en fil med namnet pyodbc-demo.py med följande innehåll. Ersätt <dsn-name> med namnet på ODBC DSN som du skapade tidigare, spara filen och kör sedan filen med Python-tolken.

    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. Om du vill påskynda körningen av koden startar du klustret som motsvarar HTTPPath inställningen i ditt DSN.

  3. Kör filen med Python-tolken pyodbc-demo.py . Information om tabellens rader visas.

Nästa steg

  • Om du vill köra Python-testkoden mot ett annat kluster eller SQL-lager skapar du ett annat DSN och ändrar <dsn-name> till DSN:s namn.
  • Om du vill köra Python-testkoden med en annan SQL-fråga ändrar du kommandosträngen execute .

Använda en DSN-mindre anslutning

Som ett alternativ till att använda ett DSN-namn kan du ange anslutningsinställningarna infogade. I följande exempel visas hur du använder en DSN-mindre anslutningssträng för personlig åtkomsttokenautentisering i Azure Databricks. Det här exemplet förutsätter att du har följande miljövariabler:

Information om hur du anger miljövariabler finns i dokumentationen till operativsystemet.

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)

I följande exempel används OAuth-användar-till-dator (U2M) eller OAuth 2.0 webbläsarbaserad autentisering i stället för en personlig åtkomsttoken för Azure Databricks. Det här exemplet förutsätter att du redan har angett föregående DATABRICKS_SERVER_HOSTNAME variabler och DATABRICKS_HTTP_PATH miljövariabler.

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)

I följande exempel används autentiseringsuppgifter för OAuth från dator till dator (M2M) eller OAuth 2.0-klientautentiseringsuppgifter. Det här exemplet förutsätter att du redan har angett föregående DATABRICKS_SERVER_HOSTNAME variabler och DATABRICKS_HTTP_PATH miljövariabler samt följande miljövariabler:

  • Ange ARM_CLIENT_ID värdet för tjänstens huvudnamns program-ID (klient).
  • Ange DATABRICKS_OAUTH_SECRET till tjänstens huvudnamns OAuth Secret-värde . (Microsoft Entra-ID-hemligheter stöds inte för OAuth M2M- eller OAuth 2.0-klientautentiseringsuppgifter med Databricks ODBC-drivrutinen.)

Mer information finns i OAuth-autentisering från dator till dator (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)

Felsökning

Det här avsnittet tar upp vanliga problem när du använder pyodbc med Databricks.

Unicode-avkodningsfel

Problem: Du får ett felmeddelande som liknar följande:

<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

Orsak: Det finns ett problem i pyodbc version 4.0.31 eller senare som kan visas med sådana symtom när du kör frågor som returnerar kolumner med långa namn eller ett långt felmeddelande. Problemet har åtgärdats av en nyare version av pyodbc.

Lösning: Uppgradera installationen av pyodbc till version 4.0.32 eller senare.

Allmän felsökning

Se Problem på lagringsplatsen mkleehammer/pyodbc på GitHub.