Sdílet prostřednictvím


Připojení Pythonu a pyodbc k Azure Databricks

Z místního kódu Pythonu se můžete připojit přes ODBC k datům v clusteru Azure Databricks nebo SQL Warehouse. K tomu můžete použít opensourcový modul pyodbckódu Pythonu .

Podle těchto pokynů nainstalujte, nakonfigurujte a použijte pyodbc.

Další informace o pyodbctomto tématu najdete na wikiwebu pyodbc.

Poznámka:

Databricks nabízí konektor SQL Databricks pro Python jako alternativu k pyodbc. Konektor SQL Databricks pro Python je jednodušší nastavit a používat a má robustnější sadu konstruktorů kódování než pyodbc. Při načítání dotazů nad 10 MB ale pyodbc může být výkon vyšší.

Tyto pokyny byly testovány s ovladačem ODBC Databricks 2.7.5, pyodbc 5.0.1 a unixODBC 2.3.12.

Požadavky

  • Místní vývojový počítač, na kterém běží jedna z následujících možností:
    • macOS
    • Windows
    • Distribuce systému Unix nebo Linux, která podporuje .rpm nebo .deb soubory
  • pip.
  • V systémech Unix, Linux nebo macOS homebrew.
  • Cluster Azure Databricks, Databricks SQL Warehouse nebo obojí. Další informace najdete v referenčních informacích ke konfiguraci výpočetních prostředků a připojení ke službě SQL Warehouse.

Krok 1: Stažení, instalace a konfigurace softwaru

V tomto kroku stáhnete a nainstalujete ovladač ODBC Databricks, unixodbc balíček a pyodbc modul. (Modul pyodbc vyžaduje unixodbc balíček v systémech Unix, Linux a macOS.) Nakonfigurujete také název zdroje dat ODBC (DSN) pro ověření a připojení ke clusteru nebo SQL Warehouse.

  1. Stáhněte a nainstalujte ovladač ODBC Databricks a nakonfigurujte název DSN ODBC pro váš operační systém.
  2. V systémech Unix, Linux a macOS nainstalujte unixodbc balíček: z terminálu pomocí Homebrew spusťte příkaz brew install unixodbc. Další informace naleznete v unixodbc na webu Homebrew.
  3. pyodbc Nainstalujte modul: z terminálu nebo příkazového řádku použijte pip ke spuštění příkazu pip install pyodbc. Další informace najdete v tématu pyodbc na webu PyPI a instalace na wikiwebu pyodbc.

Krok 2: Otestování konfigurace

V tomto kroku napíšete a spustíte kód Pythonu pro použití clusteru Azure Databricks nebo služby Databricks SQL Warehouse k dotazování trips tabulky ve schématu samples katalogu nyctrips a zobrazení výsledků.

  1. Vytvořte soubor s názvem pyodbc-demo.py s následujícím obsahem. Nahraďte <dsn-name> názvem zdroje dat ODBC, který jste vytvořili dříve, uložte soubor a spusťte ho s interpretem Pythonu.

    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. Pokud chcete zrychlit spuštění kódu, spusťte cluster , který odpovídá HTTPPath nastavení ve vašem DSN.

  3. pyodbc-demo.py Spusťte soubor s interpretem Pythonu. Zobrazí se informace o řádcích tabulky.

Další kroky

  • Pokud chcete spustit testovací kód Pythonu pro jiný cluster nebo SQL Warehouse, vytvořte jiný název DSN a změňte <dsn-name> název DSN.
  • Pokud chcete spustit testovací kód Pythonu s jiným dotazem SQL, změňte execute řetězec příkazu.

Použití připojení bez dsN

Jako alternativu k použití názvu DSN můžete zadat nastavení připojení vložené. Následující příklad ukazuje, jak použít připojovací řetězec bez DSN pro ověřování tokenů pat Azure Databricks. Tento příklad předpokládá, že máte následující proměnné prostředí:

Pokud chcete nastavit proměnné prostředí, přečtěte si dokumentaci k vašemu operačnímu systému.

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)

Následující příklad používá ověřování založené na prohlížeči OAuth uživatele na počítač (U2M) nebo OAuth 2.0 místo tokenu pat přístupu Azure Databricks. Tento příklad předpokládá, že jste už nastavili předchozí DATABRICKS_SERVER_HOSTNAME proměnné prostředí a DATABRICKS_HTTP_PATH proměnné prostředí.

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)

Následující příklad používá ověřování přihlašovacích údajů klienta OAuth typu machine-to-machine (M2M) nebo OAuth 2.0. Tento příklad předpokládá, že jste už nastavili předchozí DATABRICKS_SERVER_HOSTNAME proměnné prostředí a DATABRICKS_HTTP_PATH také následující proměnné prostředí:

  • Nastavte ARM_CLIENT_ID hodnotu ID aplikace (klienta) instančního objektu.
  • Nastavte DATABRICKS_OAUTH_SECRET na hodnotu tajného klíče OAuth instančního objektu. (Tajné kódy Microsoft Entra ID nejsou podporovány pro ověřování přihlašovacích údajů klienta OAuth M2M nebo OAuth 2.0 pomocí ovladače ODBC Databricks.)

Další informace najdete v tématu OAuth ověřování typu počítač-počítač (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)

Řešení problému

Tato část řeší běžné problémy při používání pyodbc s Databricks.

Chyba dekódování unicode

Problém: Zobrazí se chybová zpráva podobná této:

<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

Příčina: Problém existuje ve pyodbc verzi 4.0.31 nebo nižší, která by se mohla projevit s těmito příznaky při spouštění dotazů, které vracejí sloupce s dlouhými názvy nebo dlouhou chybovou zprávou. Tento problém je opraven novější verzí aplikace pyodbc.

Řešení: Upgradujte instalaci pyodbc na verzi 4.0.32 nebo vyšší.

Obecné řešení potíží

Podívejte se na problémy v úložišti mkleehammer/pyodbc na GitHubu.