Подключение Python и pyodbc к Azure Databricks
Вы можете подключиться из локального кода Python через ODBC к данным в кластере Azure Databricks или хранилище SQL. Для этого можно использовать модуль pyodbc
кода Python с открытым кодом.
Чтобы установить, настроить и использовать pyodbc
, выполните эти инструкции.
Дополнительные сведения о pyodbc
см. в вики-ресурсе pyodbc.
Примечание.
В качестве альтернативы для Databricks предлагает соединитель SQL Databricks для Pythonpyodbc
. Соединитель Databricks SQL для Python проще в настройке и использовании, и обладает более надёжными конструкциями для программирования, чем pyodbc
. Однако производительность pyodbc
при выборке результатов запросов размером более 10 МБ может быть выше.
Эти инструкции были протестированы с драйвером ODBC Databricks 2.7.5, pyodbc 5.0.1 и unixODBC 2.3.12.
Требования
- Локальный компьютер разработки, на котором запущен один из следующих вариантов:
- macOS
- Windows
- Дистрибутив UNIX или Linux, поддерживающий файлы
.rpm
или.deb
- pip.
- Для UNIX, Linux или macOS: Homebrew.
- Кластер Azure Databricks, хранилище SQL Databricks или и то, и другое. Дополнительные сведения см . в справочнике по конфигурации вычислений и подключении к хранилищу SQL.
Шаг 1. Скачивание, установка и настройка программного обеспечения
На этом шаге вы скачиваете и устанавливаете драйвер ODBC для Databricks, пакет unixodbc
и модуль pyodbc
. (Для pyodbc
модуля требуется unixodbc
пакет в Unix, Linux и macOS.) Вы также настраиваете имя источника данных ODBC (DSN) для проверки подлинности и подключения к кластеру или хранилищу SQL.
- Скачайте и установите драйвер ODBC Databricks и настройте DSN ODBC для вашей операционной системы.
- Для Unix, Linux и macOS установите
unixodbc
пакет: из терминала используйте Homebrew для выполнения командыbrew install unixodbc
. Дополнительные сведения см. в разделе unixodbc на веб-сайте Homebrew. -
pyodbc
Установите модуль: из терминала или командной строки, используйтеpip
для выполнения командыpip install pyodbc
. Дополнительные сведения см. в разделе pyodbc на веб-сайте PyPI и статье об установке на вики-ресурсе pyodbc.
Шаг 2. Проверка конфигурации
На этом шаге вы напишете и запустите код Python для использования кластера Azure Databricks или хранилища SQL Databricks для запроса таблицы trips
в схеме samples
каталога nyctrips
и отображения результатов.
Создайте файл
pyodbc-demo.py
со следующим содержимым: Замените<dsn-name>
именем созданного ранее ИМЕНИ DSN ODBC, сохраните файл и запустите файл с интерпретатором 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)
Чтобы ускорить выполнение кода, запустите кластер , соответствующий
HTTPPath
параметру в dsN.Запустите файл
pyodbc-demo.py
в интерпретаторе Python. Отображаются сведения о строках таблицы.
Следующие шаги
- Чтобы запустить тестовый код Python в другом кластере или хранилище SQL, создайте другое имя DSN и измените
<dsn-name>
его имя. - Чтобы запустить тестовый код Python с другим запросом SQL, измените строку команды
execute
.
Использование подключения dsN без использования
В качестве альтернативы использованию имени DSN можно указать встроенные параметры подключения. В следующем примере показано, как использовать строка подключения dsN для проверки подлинности личного маркера доступа Azure Databricks. В этом примере предполагается, что у вас есть следующие переменные среды:
- Задайте
DATABRICKS_SERVER_HOSTNAME
к имени экземпляра рабочей области , напримерadb-1234567890123456.7.azuredatabricks.net
. - Установите значение
равным значению HTTP пути пути HTTPдля кластера или SQL хранилища в рабочей области. Чтобы получить значение , см. раздел Получите сведения о подключении для вычислительного ресурса Azure Databricks . - Установите для целевого пользователя
DATABRICKS_TOKEN
токен личного доступа Azure Databricks. Чтобы создать личный маркер доступа, ознакомьтесь с маркерами личного доступа Azure Databricks для пользователей рабочей области.
Чтобы задать переменные среды, ознакомьтесь с документацией операционной системы.
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)
В следующем примере вместо личного маркера доступа Azure Databricks используется проверка подлинности на основе браузера OAuth (U2M) или OAuth 2.0. В этом примере предполагается, что вы уже установили предыдущие DATABRICKS_SERVER_HOSTNAME
и 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)
В следующем примере используется аутентификация OAuth на уровне автоматического взаимодействия между машинами (M2M) или аутентификация клиентских учетных данных OAuth 2.0. В этом примере предполагается, что вы уже установили предыдущие DATABRICKS_SERVER_HOSTNAME
и DATABRICKS_HTTP_PATH
переменные среды, а также следующие переменные среды:
- Задайте
ARM_CLIENT_ID
значение идентификатора приложения (клиента) для субъекта-службы. - Установите для
значение OAuth секрета основного объекта службы . (Секреты идентификатора Microsoft Entra не поддерживаются для проверки подлинности учетных данных клиента OAuth M2M или OAuth 2.0 с помощью драйвера ODBC Databricks.)
Дополнительные сведения см. в разделе проверки подлинности 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)
Устранение неполадок
В этом разделе рассматриваются распространенные проблемы при использовании pyodbc
с Databricks.
Ошибка декодирования Юникода
Проблема: появляется сообщение об ошибке, аналогичное указанному ниже.
<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
причина: проблема существует в pyodbc
версии 4.0.31 или ниже, которая может проявляться с такими симптомами при выполнении запросов, возвращающих столбцы с длинными именами или длинным сообщением об ошибке. Эта проблема устранена в более новой версии pyodbc
.
Решение: обновите установленный экземпляр pyodbc
до версии 4.0.32 или более поздней.
Общие действия по устранению неполадок
См. раздел Проблемы в репозитории mkleehammer/pyodbc на GitHub.