使用 Python 和 R 模块

本文介绍如何使用相对路径导入存储在工作区文件中的自定义 Python 和 R 模块以及 Databricks 笔记本。 工作区文件有助于实现更紧凑的开发生命周期,使你能够将代码模块化将 %run 命令转换为 import 语句,并将 Python wheel 文件重构为联合版本化的模块。 还可以使用内置的 Databricks Web 终端来测试代码

注意

在 Databricks Runtime 14.0 及更高版本中,本地执行的代码的默认当前工作目录 (CWD) 是包含正在运行的笔记本或脚本的目录。 这是 Databricks Runtime 13.3 LTS 及更低版本的行为更改。 请参阅什么是默认的当前工作目录?

导入 Python 和 R 模块

重要

在 Databricks Runtime 13.3 LTS 及更高版本中,添加到 Python sys.path 的目录或结构化为 Python 包的目录会自动分发到群集中的所有执行程序。 在 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 执行器的节点,因此在开发在工作器节点上运行的模块(例如 UDF)时不应使用 autoreload

在 Databricks Runtime 16.0 及更高版本中, autoreload Databricks 中的扩展添加了以下功能:

  • 支持针对模块的重载,以修改函数内部。 尽可能只重新加载模块的已更改部分,可确保每个对象只有一个外部可见的实例,这更安全、更可靠。
  • 从工作区文件导入 Python 模块时,Databricks 会自动建议使用 autoreload 模块自上次导入以来已更改。

若要了解有关扩展的详细信息 autoreload ,请参阅 IPython 自动加载文档

重构代码

进行代码开发的最佳做法是将代码模块化,以便轻松重用。 可以通过工作区文件创建自定义 Python 文件,并使用 import 语句使这些文件中的代码在笔记本中可用。

要将笔记本代码重构为可重用文件,请执行以下操作:

  1. 为你的代码创建一个新的源代码文件。
  2. 将 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)

随后可以使用 %run 命令使 power.py 中定义的函数可供其他笔记本使用:

# 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 Web 终端进行测试

可以使用 Azure Databricks Web 终端测试 Python 或 R 代码的修改,而无需使用笔记本导入和运行文件。

  1. 打开 Web 终端
  2. 切换到目录:cd /Workspace/Users/<path-to-directory>/
  3. 运行 Python 或 R 文件:python file_name.pyRscript file_name.r