Łą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 do wykonywania zapytań dotyczących trips
tabeli w samples
schemacie 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
na nazwę wystąpienia obszaru roboczego, na przykładadb-1234567890123456.7.azuredatabricks.net
. - Ustaw
DATABRICKS_HTTP_PATH
wartość ścieżka HTTP dla klastra docelowego lub usługi SQL Warehouse w obszarze roboczym. Aby uzyskać wartość ścieżki HTTP, zobacz Pobieranie szczegółów połączenia dla zasobu obliczeniowego usługi Azure Databricks. - Dla użytkownika docelowego ustaw
DATABRICKS_TOKEN
osobisty token dostępu usługi Azure Databricks. 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 masz już ustawione poprzednie DATABRICKS_SERVER_HOSTNAME
zmienne środowiskowe i DATABRICKS_HTTP_PATH
.
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 powyższe DATABRICKS_SERVER_HOSTNAME
zmienne środowiskowe i DATABRICKS_HTTP_PATH
oraz następujące zmienne środowiskowe:
- Ustaw
ARM_CLIENT_ID
wartość identyfikatora aplikacji (klienta) jednostki usługi. - Ustaw
DATABRICKS_OAUTH_SECRET
wartość wpisu tajnego OAuth jednostki usługi. (Wpisy tajne identyfikatora Entra firmy Microsoft nie są obsługiwane w przypadku uwierzytelniania OAuth M2M lub OAuth 2.0 przy użyciu sterownika ODBC usługi 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
wersji 4.0.31 lub nowszej, który 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.