Unity Catalog 中 (UDF) 的用户定义函数

重要

此功能在 Databricks Runtime 13.2 及更高版本中作为公共预览版提供。

Azure Databricks 提供 SQL 本机语法,用于将自定义函数注册到受 Unity Catalog 管理的架构。 Azure Databricks 上的所有 Unity Catalog 计算都支持标准 CREATE FUNCTION SQL 语法。 在 Pro 或无服务器 SQL 仓库以及 Databricks Runtime 13.2 及更高版本中,可以在注册到 Unity Catalog 的函数中包含 Python 代码。

注意

从使用 UDF 的查询注册的视图必须使用支持的计算。 经典 SQL 仓库和 Databricks Runtime 13.1 及更低版本无法解析包含已注册到 Unity Catalog 的 UDF 的视图。

有关完整的 SQL 语言参考,请参阅 CREATE FUNCTION (SQL 和 Python)

有关 Unity Catalog 如何管理函数权限的信息,请参阅 CREATE FUNCTION

重要

在 Unity Catalog 中注册为函数的 Python UDF 在范围和支持方面不同于作用域为笔记本或 SparkSession 的 PySpark UDF。 请参阅用户定义标量函数 - Python

Unity Catalog 中的自定义 SQL 函数

使用为 Unity Catalog 配置的计算创建 SQL 函数时,该函数默认注册到当前活动架构。 以下示例演示了可用于声明新函数的目标目录和架构的语法:

CREATE FUNCTION target_catalog.target_schema.roll_dice()
    RETURNS INT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    COMMENT 'Roll a single 6 sided die'
    RETURN (rand() * 6)::INT + 1;

然后,对函数具有足够权限的所有用户都可以在为 Unity Catalog 配置的计算环境中使用该函数,如以下示例所示:

SELECT target_catalog.target_schema.roll_dice()

注意

可以使用利用 LANGUAGE SQL 的 UDF 返回表或标量值。

将 Python UDF 注册到 Unity Catalog

在 Databricks Runtime 13.1 及更高版本中,可以使用 SQL CREATE FUNCTION 语句将标量 Python UDF 注册到 Unity Catalog。

重要

只有 Pro 和无服务器 SQL 仓库支持 Unity Catalog 的 Python UDF。

Python UDF 旨在直接在 SQL 函数中提供 Python 的完整表现力,允许自定义操作,例如高级转换、数据掩码和哈希。

Python UDF 在安全隔离的环境中执行,无权访问文件系统或内部服务。

在无服务器计算或共享访问模式下运行的 Python UDF 允许通过端口 80、443 和 53 传输 TCP/UDP 网络流量。

请参阅哪些 UDF 最高效?

注意

Unity Catalog 中 Python UDF 的语法和语义不同于注册到 SparkSession 的 Python UDF。 请参阅用户定义标量函数 - Python

适用于 Unity Catalog 的 Python UDF 使用语句由双美元符号 ($$) 设置,如以下代码示例所示:

CREATE FUNCTION target_catalog.target_schema.greet(s STRING)
RETURNS STRING
LANGUAGE PYTHON
AS $$
  return f"Hello, {s}"
$$

以下示例演示如何使用此函数返回存储在名为 students 的表的 first_name 列中的所有名称的 greeting 语句:

SELECT target_catalog.target_schema.greet(first_name)
FROM students;

可以在 Python UDF 中定义任意数量的 Python 函数,但必须返回标量值。

Python 函数必须独立处理 NULL 值,并且所有类型映射都必须遵循 Azure Databricks SQL 语言映射

可以导入 Azure Databricks 包含的标准 Python 库,但不能包括自定义库或外部依赖项。

如果未指定目录或架构,则 Python UDF 将注册到当前活动架构。

以下示例导入库并在 Python UDF 中使用多个函数:

CREATE FUNCTION roll_dice(num_dice INTEGER, num_sides INTEGER)
RETURNS INTEGER
LANGUAGE PYTHON
AS $$
  import numpy as np

  def roll_die(num_sides):
    return np.random.randint(num_sides) + 1

  def sum_dice(num_dice,num_sides):
    return sum([roll_die(num_sides) for x in range(num_dice)])

  return sum_dice(num_dice, num_side)
$$