跳到主要内容

CREATE FUNCTION

Introduced or updated: v1.2.955

创建通过 Flight 调用远程 handler 的外部函数,通常使用 Python 或其他服务。

支持语言​

  • 由远程服务器决定。常见语言为 Python,只要实现 Flight 端点,也可以使用其他语言。

语法​

CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ] <function_name>
( <input_param_types> ) RETURNS <return_type> LANGUAGE <language_name>
HANDLER = '<handler_name>' ADDRESS = '<udf_server_address>'
[ EXTERNAL_ACCESS_INTEGRATIONS = (<integration_name>, ...) ]
[ DESC = '<description>' ]
参数说明
<function_name>函数名称。
<input_param_types>以逗号分隔的参数类型。
<return_type>返回类型,必须与远程 schema 匹配。
LANGUAGEHandler 使用的语言,例如 python。
HANDLER远程 handler 名称。
ADDRESSArrow Flight UDF 服务器的 HTTP(S) 地址,不是 REST 端点。
EXTERNAL_ACCESS_INTEGRATIONS可选、非空的 integration 标识符列表,仅支持带远程 ADDRESS 的定义。
DESC可选的函数描述。

访问控制​

创建 UDF 需要全局 SUPER。如果定义引用了 integration,开发者还必须拥有每个 integration 的 USAGE。Databend 在 integration 绑定的策略和 Flight schema 校验之前检查这些权限。

所有被引用的 integration 都必须存在且已启用。地址至少需要匹配这些对象中的一个规则。非空的 operator udf_server_allow_list 仍是额外的主机上限。未引用 integration 时,使用原有的配置 allow-list 检查;列表为空时拒绝该地址。

SQL 管理的配置、权限与策略异步传播行为见外部访问集成。

示例​

以下示例演示如何配置计算两个整数最大公约数(GCD)的外部函数。

第一步:配置 Python UDF 服务器​

外部函数通过 Apache Arrow Flight(gRPC/HTTP2)通信,而不是 REST。安装 databend-udf:

pip install databend-udf

创建文件 udf_server.py:

from databend_udf import udf, UDFServer

@udf(
input_types=["INT", "INT"],
result_type="INT NULL",
skip_null=True,
)
def gcd(x: int, y: int) -> int:
while y != 0:
(x, y) = (y, x % y)
return x

if __name__ == '__main__':
server = UDFServer("0.0.0.0:8815")
server.add_function(gcd)
server.serve()

启动服务器:

python udf_server.py

第二步:配置 Databend 访问 UDF 服务器​

本地或私有化测试时,在每个 Databend Query 节点配置:

[query]
enable_udf_server = true
udf_server_allow_insecure = true
udf_server_allow_list = ["http://127.0.0.1:8815"]

请使用每个 Query 节点都能访问的地址。此本地示例使用原有的配置 allow list。要通过 SQL 管理目标,请使用外部访问集成;非空的 operator allow list 仍是上限。

在 Databend Cloud 中,请提供支持 gRPC/HTTP2 的 HTTPS Flight 端点。服务 operator 仍控制是否启用远程 UDF 以及配置中的主机限制。如果 operator 配置拒绝该目标,请通过 Support → Create New Ticket 联系支持团队。Integration 无法绕过这些配置。

第三步:在 Databend 中注册函数​

CREATE FUNCTION gcd (INT, INT)
RETURNS INT NULL
LANGUAGE python
HANDLER = 'gcd'
ADDRESS = 'http://127.0.0.1:8815';

第四步:调用函数​

SELECT gcd(48, 18);
-- 返回:6

SELECT gcd(100, 75);
-- 返回:25
欢迎体验 Databend Cloud

基于 Rust + 对象存储构建的新一代多模态数仓,一个平台即可进行 BI、向量、全文检索及地理空间分析。

支持标准 SQL,自动弹性伸缩,助您快速构建现代化数据平台。

注册即领 ¥200 代金券。

注册体验