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 set upp och använda, och har ett mer robust set av 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 pyodbcunixodbc 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 tripstable i samplescatalognyctripsschema 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 table:s 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:

För att se set miljövariabler, konsultera dokumentationen för 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 set de ovannämnda DATABRICKS_SERVER_HOSTNAME och DATABRICKS_HTTP_PATH miljövariablerna.

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 OAuth maskin-till-maskin (M2M) eller OAuth 2.0 klient credentials autentisering. Det här exemplet förutsätter att du redan har set föregående DATABRICKS_SERVER_HOSTNAME och DATABRICKS_HTTP_PATH miljövariabler samt följande miljövariabler:

  • Set ARM_CLIENT_ID till tjänstens huvudnamns program-ID (klient) värde.
  • Set DATABRICKS_OAUTH_SECRET till tjänstens huvudnamns OAuth-hemlighet -värde. (Microsoft Entra ID-hemligheter stöds inte för OAuth M2M- eller OAuth 2.0-klient credentials autentisering 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 columns 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.