Работа с модулями Python и R
В этой статье описывается, как использовать относительные пути для импорта пользовательских модулей Python и R, хранящихся в файлах рабочей области вместе с записными книжками Databricks. Файлы рабочей области могут упростить более жесткие жизненные циклы разработки, позволяя модульизировать код, преобразовать команды %run в инструкции импорта и рефакторинг файлов колес Python в совместно версиях модулей. Для тестирования кода можно также использовать встроенный веб-терминал Databricks.
Примечание.
В Databricks Runtime 14.0 и выше текущий рабочий каталог по умолчанию (CWD) для кода, выполняемого локально, — это каталог, содержащий записную книжку или скрипт, выполняемый. Это изменение поведения из Databricks Runtime 13.3 LTS и ниже. См. раздел " Что такое текущий рабочий каталог по умолчанию?".
Импорт модулей Python и R
Внимание
В Databricks Runtime 13.3 LTS и более поздних версиях каталоги, добавленные в Python или каталоги, структурированные как пакеты Pythonsys.path
, автоматически распределяются всем исполнителям в кластере. В Databricks Runtime 12.2 LTS и ниже библиотеки, добавленные в sys.path
него, должны быть явно установлены на исполнителях.
В Databricks Runtime 11.3 LTS и более поздних версиях текущий рабочий каталог записной книжки автоматически добавляется в путь Python. Если вы используете папки Git, добавляется корневой каталог репозитория.
Чтобы импортировать модули из другого каталога, необходимо добавить каталог, содержащий модуль sys.path
. Каталоги можно указать с помощью относительного пути, как показано в следующем примере:
import sys
import os
sys.path.append(os.path.abspath('..'))
Функции импортируются из модуля, хранящегося в файлах рабочей области, так же, как и из модуля, сохраненного в виде библиотеки кластера или библиотеки с областью действия записной книжки:
Python
from sample import power
power.powerOfTwo(3)
R
source("sample.R")
power.powerOfTwo(3)
Внимание
При использовании инструкции import
и нескольких библиотек одного и того же имени databricks использует правила приоритета для определения загрузки библиотеки. Ознакомьтесь с приоритетом библиотеки Python.
Автоматическая перезагрузка модулей Python
При редактировании нескольких файлов при разработке кода Python можно включить autoreload
расширение для автоматической перезагрузки всех импортированных модулей, чтобы команда запускала эти изменения. Используйте следующие команды в любой ячейке записной книжки или файле Python, чтобы включить autoreload
расширение:
%load_ext autoreload
%autoreload 2
Расширение autoreload
работает только в процессе драйвера Spark и не перезагрузит код в процессы исполнителя Spark. Так как он работает только на узле драйвера Spark, а не на узлах, на которых запущен исполнитель Spark, не следует использовать autoreload
при разработке модулей, работающих на рабочих узлах (например, определяемых пользователем).
В Databricks Runtime 16.0 и выше расширение autoreload
в Databricks добавляет следующие функции:
- Поддержка целевой перезагрузки модулей для изменения внутренних функций. Перезагрузить только измененную часть модуля, если это возможно, гарантирует, что существует только один внешний видимый экземпляр каждого объекта, который является более безопасным и надежным.
- При импорте модуля Python из файла рабочей области Databricks автоматически предлагает использовать
autoreload
, если модуль изменился с момента последнего импорта.
Дополнительные сведения о autoreload
расширении см. в документации по автозагрузчику IPython.
Рефакторинг кода
Для разработки кода рекомендуется разделять его на модули для удобства повторного использования. Вы можете создать пользовательские файлы Python с файлами рабочей области и сделать код в этих файлах доступным для записной книжки с помощью инструкции import
.
Рефакторинг кода записной книжки в файлы, которые можно использовать повторно:
- Создайте новый файл исходного кода для вашего кода.
- Добавьте в записную книжку инструкции импорта Python, чтобы сделать код в новом файле доступным для записной книжки.
Миграция из %run
команд
Если вы используете %run
команды для создания функций Python или R, определенных в записной книжке, доступной для другой записной книжки или установки пользовательских файлов в кластере, рассмотрите возможность включения этих пользовательских .whl
модулей в виде файлов рабочей области. Таким образом вы можете сохранить записные книжки и другие модули кода в синхронизации, гарантируя, что записная книжка всегда использует правильную версию.
%run
команды позволяют включать одну записную книжку в другую и часто использовать для поддержки кода Python или R, доступного для записной книжки. В этом примере записная книжка с именем power.py
содержит приведенный ниже код.
# This code is in a notebook named "power.py".
def n_to_mth(n,m):
print(n, "to the", m, "th power is", n**m)
Затем можно сделать функции, определенные в power.py
, доступными для другой записной книжки, с помощью команды %run
:
# This notebook uses a %run command to access the code in "power.py".
%run ./power
n_to_mth(3, 4)
С помощью файлов рабочей области можно напрямую импортировать модуль, содержащий код Python, и запустить функцию.
from power import n_to_mth
n_to_mth(3, 4)
Рефакторинг файлов Python .whl
в относительные библиотеки
Вы можете установить пользовательские файлы .whl
в кластер, а затем импортировать их в записную книжку, подключенную к этому кластеру. Однако этот процесс может быть громоздким и подвержен ошибкам для часто обновляемого кода. Файлы рабочей области позволяют хранить эти файлы Python в том же каталоге, что и записные книжки, использующие код, гарантируя, что записная книжка всегда использует правильную версию.
Дополнительные сведения об упаковке проектов Python см. в этом руководстве.
Использование веб-терминала Azure Databricks для тестирования
Веб-терминал Azure Databricks можно использовать для тестирования изменений в коде Python или R без использования записной книжки для импорта и запуска файла.
- Откройте веб-терминал.
- Перейдите в каталог:
cd /Workspace/Users/<path-to-directory>/
- Запустите файл Python или R:
python file_name.py
илиRscript file_name.r
.