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)
$$