Łączenie języka Python i rozwiązania pyodbc z usługą Azure Databricks
Możesz nawiązać połączenie z lokalnego kodu w języku Python za pośrednictwem funkcji ODBC z danymi w klastrze usługi Azure Databricks lub usłudze SQL Warehouse. W tym celu możesz użyć modułu pyodbc
kodu języka Python typu open source.
Postępuj zgodnie z tymi instrukcjami, aby zainstalować, skonfigurować i użyć polecenia pyodbc
.
Aby uzyskać więcej informacji na temat pyodbc
witryny , zobacz witrynę typu wiki pyodbc.
Uwaga
Usługa Databricks oferuje łącznik SQL usługi Databricks dla języka Python jako alternatywę dla pyodbc
języka . Łącznik SQL usługi Databricks dla języka Python jest łatwiejszy do skonfigurowania i użycia oraz ma bardziej niezawodny zestaw konstrukcji kodowania niż pyodbc
. Jednak pyodbc
może mieć lepszą wydajność podczas pobierania wyników zapytań powyżej 10 MB.
Te instrukcje zostały przetestowane za pomocą sterownika OdBC usługi Databricks 2.7.5, pyodbc 5.0.1 i unixODBC 2.3.12.
Wymagania
- Lokalna maszyna deweloperna z uruchomioną jedną z następujących czynności:
- macOS
- Windows
- Dystrybucja systemu Unix lub Linux, która obsługuje
.rpm
pliki lub.deb
- .
- W przypadku systemów Unix, Linux lub macOS homebrew.
- Klaster usługi Azure Databricks, magazyn SQL usługi Databricks lub oba te elementy. Aby uzyskać więcej informacji, zobacz Informacje o konfiguracji obliczeniowej i Nawiązywanie połączenia z usługą SQL Warehouse.
Krok 1. Pobieranie, instalowanie i konfigurowanie oprogramowania
W tym kroku pobierzesz i zainstalujesz sterownik ODBC usługi Databricks, unixodbc
pakiet i pyodbc
moduł. (Moduł pyodbc
wymaga unixodbc
pakietu w systemach Unix, Linux i macOS). Należy również skonfigurować nazwę źródła danych ODBC (DSN) w celu uwierzytelniania za pomocą polecenia i nawiązania połączenia z klastrem lub usługą SQL Warehouse.
- Pobierz i zainstaluj sterownik ODBC usługi Databricks oraz skonfiguruj nazwę DSN ODBC dla systemu operacyjnego.
- W przypadku systemów Unix, Linux i macOS zainstaluj
unixodbc
pakiet: z poziomu terminalu użyj oprogramowania Homebrew, aby uruchomić poleceniebrew install unixodbc
. Aby uzyskać więcej informacji, zobacz unixodbc w witrynie internetowej Oprogramowania Homebrew. - Zainstaluj moduł: z poziomu terminalu
pyodbc
lub wiersza polecenia użyjpip
polecenia , aby uruchomić poleceniepip install pyodbc
. Aby uzyskać więcej informacji, zobacz pyodbc w witrynie internetowej PyPI i Zainstaluj w witrynie typu wiki pyodbc.
Krok 2. Testowanie konfiguracji
W tym kroku napiszesz i uruchomisz kod języka Python, aby użyć klastra usługi Azure Databricks lub usługi Databricks SQL Warehouse w celu wykonywania zapytań dotyczących tabeli trips
w schemacie samples
katalogu nyctrips
i wyświetlania wyników.
Utwórz plik o nazwie z
pyodbc-demo.py
następującą zawartością. Zastąp<dsn-name>
ciąg nazwą utworzonej wcześniej nazwy DSN ODBC, zapisz plik, a następnie uruchom plik za pomocą interpretera języka 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)
Aby przyspieszyć uruchamianie kodu, uruchom klaster odpowiadający
HTTPPath
ustawieniu w nazwie DSN.Uruchom plik za
pyodbc-demo.py
pomocą interpretera języka Python. Zostaną wyświetlone informacje o wierszach tabeli.
Następne kroki
- Aby uruchomić kod testowy języka Python dla innego klastra lub usługi SQL Warehouse, utwórz inną nazwę DSN i zmień
<dsn-name>
nazwę na nazwę DSN. - Aby uruchomić kod testowy języka Python z innym zapytaniem SQL, zmień
execute
ciąg polecenia.
Korzystanie z połączenia bez nazwy DSN
Alternatywą dla używania nazwy DSN jest określenie wbudowanych ustawień połączenia. W poniższym przykładzie pokazano, jak używać parametry połączenia bez dsN na potrzeby uwierzytelniania osobistego tokenu dostępu w usłudze Azure Databricks. W tym przykładzie przyjęto założenie, że masz następujące zmienne środowiskowe:
- Ustaw
DATABRICKS_SERVER_HOSTNAME
jako nazwę instancji obszaru roboczego na, na przykładadb-1234567890123456.7.azuredatabricks.net
. - Ustaw
DATABRICKS_HTTP_PATH
na wartość ścieżki HTTP dla klastra docelowego lub magazynu SQL w obszarze roboczym. Aby uzyskać wartość ścieżki HTTP, zobacz Uzyskiwanie szczegółów połączenia dla zasobu obliczeniowego usługi Azure Databricks . - Ustaw
DATABRICKS_TOKEN
na osobisty token dostępu usługi Azure Databricks dla użytkownika docelowego. Aby utworzyć osobisty token dostępu, zobacz Osobiste tokeny dostępu usługi Azure Databricks dla użytkowników obszaru roboczego.
Aby ustawić zmienne środowiskowe, zapoznaj się z dokumentacją systemu operacyjnego.
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)
W poniższym przykładzie użyto uwierzytelniania OAuth user-to-machine (U2M) lub uwierzytelniania opartego na przeglądarce OAuth 2.0 zamiast osobistego tokenu dostępu usługi Azure Databricks. W tym przykładzie przyjęto założenie, że zmienne środowiskowe DATABRICKS_SERVER_HOSTNAME
i DATABRICKS_HTTP_PATH
zostały już ustawione.
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)
W poniższym przykładzie użyto uwierzytelniania OAuth machine-to-machine (M2M) lub uwierzytelniania poświadczeń klienta OAuth 2.0. W tym przykładzie przyjęto założenie, że zostały już ustawione poprzednie DATABRICKS_SERVER_HOSTNAME
i DATABRICKS_HTTP_PATH
zmiennych środowiskowych, a także następujące zmienne środowiskowe:
- Ustaw
jako wartość identyfikatora aplikacji (klienta) głównego użytkownika usługi. - Ustaw wartość OAuth
DATABRICKS_OAUTH_SECRET
głównego serwisowego na . (Tajne dane identyfikatora Microsoft Entra nie są obsługiwane dla uwierzytelniania za pomocą OAuth M2M lub OAuth 2.0 przy użyciu sterownika ODBC Databricks).
Aby uzyskać więcej informacji, zobacz Uwierzytelnianie maszyny do maszyny 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)
Rozwiązywanie problemów
W tej sekcji opisano typowe problemy występujące podczas korzystania z usługi pyodbc
Databricks.
Błąd dekodowania Unicode
Problem: Zostanie wyświetlony komunikat o błędzie podobny do następującego:
<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
Przyczyna: Występuje problem w pyodbc
w wersji 4.0.31 lub starszej, która może przejawiać się takimi objawami podczas uruchamiania zapytań, które zwracają kolumny z długimi nazwami lub długim komunikatem o błędzie. Problem został rozwiązany przez nowszą wersję programu pyodbc
.
Rozwiązanie: uaktualnij instalację programu pyodbc
do wersji 4.0.32 lub nowszej.
Ogólne wskazówki dotyczące rozwiązywania problemów
Zobacz Problemy w repozytorium mkleehammer/pyodbc w witrynie GitHub.