使用 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 及更高版本中,Databricks 中的 autoreload 扩展添加了以下功能:

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

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

重构代码

进行代码开发的最佳做法是将代码模块化,以便轻松重用。 可以通过工作区文件创建自定义 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