Поделиться через


Подключение Python и pyodbc к Azure Databricks

Вы можете подключиться из локального кода Python через ODBC к данным в кластере Azure Databricks или хранилище SQL. Для этого можно использовать модуль pyodbc кода Python с открытым кодом.

Чтобы установить, настроить и использовать pyodbc, выполните эти инструкции.

Дополнительные сведения о pyodbc см. в вики-ресурсе pyodbc.

Примечание.

В качестве альтернативы для Databricks предлагает соединитель SQL Databricks для Pythonpyodbc. Соединитель SQL Databricks для 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.

  1. Скачайте и установите драйвер ODBC Databricks и настройте DSN ODBC для вашей операционной системы.
  2. Для Unix, Linux и macOS установите unixodbc пакет: из терминала используйте Homebrew для выполнения команды brew install unixodbc. Дополнительные сведения см. в разделе unixodbc на веб-сайте Homebrew.
  3. pyodbc Установите модуль: из терминала или командной строки, используйте pip для выполнения командыpip install pyodbc. Дополнительные сведения см. в разделе pyodbc на веб-сайте PyPI и статье об установке на вики-ресурсе pyodbc.

Шаг 2. Проверка конфигурации

На этом шаге вы напишете и запустите код Python для использования кластера Azure Databricks или хранилища SQL Databricks для запроса trips таблицы в samples схеме каталога nyctrips и отображения результатов.

  1. Создайте файл 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)
    
  2. Чтобы ускорить выполнение кода, запустите кластер , соответствующий HTTPPath параметру в dsN.

  3. Запустите файл pyodbc-demo.py в интерпретаторе Python. Отображаются сведения о строках таблицы.

Следующие шаги

  • Чтобы запустить тестовый код Python в другом кластере или хранилище SQL, создайте другое имя DSN и измените <dsn-name> его имя.
  • Чтобы запустить тестовый код Python с другим запросом SQL, измените строку команды execute.

Использование подключения dsN без использования

В качестве альтернативы использованию имени DSN можно указать встроенные параметры подключения. В следующем примере показано, как использовать строка подключения dsN для проверки подлинности личного маркера доступа 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 значение идентификатора приложения (клиента) субъекта-службы.
  • Задайте DATABRICKS_OAUTH_SECRET значение секрета 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.