A Python és a pyodbc Csatlakozás az Azure Databricksbe

A helyi Python-kódból az ODBC-n keresztül kapcsolódhat egy Azure Databricks-fürt vagy SQL Warehouse adataihoz. Ehhez használhatja a nyílt forráskód Python-kódmodultpyodbc.

A telepítéshez, konfiguráláshoz és használathoz pyodbckövesse az alábbi utasításokat.

További információkért pyodbclásd a pyodbc wikit.

Feljegyzés

A Databricks a Pythonhoz készült Databricks SQL Csatlakozás ort kínálja alternatívakéntpyodbc. A Pythonhoz készült Databricks SQL Csatlakozás or egyszerűbben állítható be és használható, és robusztusabb kódolási szerkezetekkel rendelkezik, mint pyodbca . 10 MB-nál nagyobb lekérdezési eredmények lekérése esetén azonban pyodbc jobb teljesítményre lehet szükség.

Ezeket az utasításokat a Databricks ODBC 2.7.5-ös, pyodbc 5.0.1-s és unixODBC 2.3.12-s illesztőprogramjával teszteltük.

Követelmények

  • Egy helyi fejlesztőgép, amely az alábbiak egyikét futtatja:
    • macOS
    • Windows
    • Unix- vagy Linux-disztribúció, amely támogatja .rpm vagy .deb fájlokat
  • pip.
  • Unix, Linux vagy macOS esetén a Homebrew.
  • Egy Azure Databricks-fürt, egy Databricks SQL Warehouse vagy mindkettő. További információ: Számítási konfigurációs referencia és SQL-raktár létrehozása.

1. lépés: Szoftver letöltése, telepítése és konfigurálása

Ebben a lépésben letölti és telepíti a Databricks ODBC-illesztőprogramot, a unixodbc csomagot és a modult pyodbc . (A pyodbc modulhoz Unix, Linux és macOS rendszeren szükséges a unixodbc csomag.) Emellett konfigurálhat egy ODBC-adatforrásnevet (DSN) is a fürt vagy az SQL Warehouse hitelesítéséhez és az ahhoz való csatlakozáshoz.

  1. Töltse le és telepítse a Databricks ODBC-illesztőprogramot , és konfiguráljon egy ODBC DSN-t az operációs rendszerhez.
  2. Unix, Linux és macOS esetén telepítse a unixodbc csomagot: a terminálról a Homebrew használatával futtassa a parancsot brew install unixodbc. További információ: unixodbc a Homebrew webhelyén.
  3. Telepítse a modult pyodbc : a terminálról vagy a parancssorból pip futtassa a parancsot pip install pyodbc. További információ: pyodbc a PyPI webhelyén, és telepítés a pyodbc wikiben.

2. lépés: A konfiguráció tesztelése

Ebben a lépésben Python-kódot kell írnia és futtatnia az Azure Databricks-fürt vagy a Databricks SQL Warehouse használatával a tripssamples katalógus sémájában lévő tábla lekérdezéséhez nyctrips és az eredmények megjelenítéséhez.

  1. Hozzon létre egy fájlt pyodbc-demo.py az alábbi tartalommal. Cserélje le <dsn-name> a korábban létrehozott ODBC DSN nevére, mentse a fájlt, majd futtassa a fájlt a Python-értelmezővel.

    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. A kód futtatásának felgyorsításához indítsa el a DSN-ben megadott beállításnak HTTPPath megfelelő fürtöt.

  3. Futtassa a fájlt a pyodbc-demo.py Python-értelmezővel. Megjelennek a táblázat sorairól szóló információk.

Következő lépések

  • Ha a Python-tesztkódot egy másik fürtre vagy SQL Warehouse-ra szeretné futtatni, hozzon létre egy másik DSN-t, és módosítsa <dsn-name> a DSN nevét.
  • Ha a Python-tesztkódot egy másik SQL-lekérdezéssel szeretné futtatni, módosítsa a execute parancssztringet.

DSN nélküli kapcsolat használata

A DSN-név használata helyett megadhatja a kapcsolati beállításokat a beágyazottban. Az alábbi példa bemutatja, hogyan használható DSN-nélküli kapcsolati sztring az Azure Databricks személyes hozzáférési jogkivonat-hitelesítéséhez. Ez a példa a következő környezeti változókat feltételezi:

A környezeti változók beállításához tekintse meg az operációs rendszer dokumentációját.

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)

Az alábbi példa OAuth-felhasználó–gép (U2M) vagy OAuth 2.0 böngészőalapú hitelesítést használ az Azure Databricks személyes hozzáférési jogkivonata helyett. Ez a példa feltételezi, hogy már beállította az előző DATABRICKS_SERVER_HOSTNAME és DATABRICKS_HTTP_PATH a környezeti változókat.

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)

Az alábbi példa OAuth-gépről gépre (M2M) vagy OAuth 2.0-s ügyfél-hitelesítő adatokat használ. Ez a példa feltételezi, hogy már beállította az előző DATABRICKS_SERVER_HOSTNAME és DATABRICKS_HTTP_PATH a környezeti változókat, valamint a következő környezeti változókat:

  • Állítsa be ARM_CLIENT_ID a szolgáltatásnév alkalmazás- (ügyfél-) azonosítójának értékét.
  • Állítsa be DATABRICKS_OAUTH_SECRET a szolgáltatásnév OAuth Secret-értékét . (A Microsoft Entra-azonosító (korábbi nevén Azure Active Directory) titkos kulcsai nem támogatottak az OAuth M2M vagy az OAuth 2.0 ügyfél hitelesítő adatainak a Databricks ODBC-illesztőprogrammal történő hitelesítéséhez.)

További információ: OAuth machine-to-machine (M2M) hitelesítés.

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)

Hibaelhárítás

Ez a szakasz a Databricks használatakor pyodbc felmerülő gyakori problémákat ismerteti.

Unicode-kódolási hiba

Probléma: A következőhöz hasonló hibaüzenet jelenik meg:

<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

Ok: A 4.0.31-es vagy újabb verzióban pyodbc olyan probléma áll fenn, amely ilyen tünetekkel jelentkezhet a hosszú neveket vagy hosszú hibaüzenetet tartalmazó oszlopokat visszaadó lekérdezések futtatásakor. A hibát a újabb verziója javította pyodbc.

Megoldás: Frissítse a telepítést pyodbc a 4.0.32-es vagy újabb verzióra.

Általános hibaelhárítás

Lásd a GitHub mkleehammer/pyodbc adattárának problémáit.