UDF-Python

您可以使用 Python 编写用户自定义函数 (UDF) 的处理程序。本篇文档将指导你如何创建一个简单 Python UDF,包括使用环境要求、UDF 创建、查看、使用和删除。

开始前准备

环境配置

在你开始之前,确认你已经下载并安装了如下软件:

  • 确认你已完成安装 Python 3.8(or plus), 使用下面的代码检查 Python 版本确认安装成功:

1. #To check with Python installation and its version 2. python3 -V

Note

若操作系统中同时拥有 Pyhon2 和 Python3,使用 UDF 前需要全局配置为 Python3,例如可以通过重命名 /usr/bin/python,然后在该处创建同名的 python3 软链来实现全局配置,相关命令示例:

1. mv /usr/bin/python /usr/bin/python.bak 2. ln -s /usr/local/python3/bin/python3 /usr/bin/python - 下载安装 protobuf 和 grpcio 工具,使用下面的代码下载安装 protobuf 和 grpcio 工具:

1. pip3 install protobuf 2. pip3 install grpcio - 确认你已完成安装 MySQL 客户端。

启动 MatrixOne

  1. 按照快速开始章节的步骤使用 mo_ctl 完成 MatrixOne 的部署。部署完成后执行如下命令修改 mo_ctl 的配置:

1. mo_ctl set_conf MO_CONF_FILE="\${MO_PATH}/matrixone/etc/launch-with-python-udf-server/launch.toml" 2. 修改配置后需要启动(或重启)MatrixOne 服务来使配置生效,例如使用 mo_ctl 启动 MatrixOne 服务:

1. mo_ctl start 3. 待 MatrixOne 服务正常启动(若 MatrixOne 是首次启动,后台初始化会需要十秒左右的时间,初始化完成后才可连接)。执行如下命令访问 MatrixOne 服务:

1. mo_ctl connect

连接成功后将进入 mysql client 命令行工具。

嵌入式构建 UDF

MatrixOne 支持在 SQL 中通过 AS 关键字直接使用 Python 代码编写函数体来创建 UDF,以这种形式创建的 UDF 被称为嵌入式 UDF。

  1. 创建一个测试库

在创建 UDF 函数之前,需要先创建一个测试库:

1. mysql> create database udf_test; 2. Query 0k, 1 row affected (0.02 sec) 3. mysql> use udf_test; 4. Database changed 2. 创建 UDF 函数

在目标库内,可执行 CREATE 命令配合 Python 语句创建 UDF 函数。例如使用如下 SQL 定义一个名为 py_add 的函数,定义参数列表接收两个类型为 int 的参数,函数功能是返回两个参数的和,具体的函数逻辑在 as 后的 python 代码中,然后,使用 handler 关键字指定调用的 python 函数名称:

1. create or replace function py_add(a int, b int) returns int language python as 2. $$ 3. def add(a, b): 4. return a + b 5. $$ 6. handler 'add';

Note

当前版本 matrixone 不会在创建 UDF 时检查 python 语法,用户需要自行保证 python 语法的正确性,否则在执行后续执行函数时会报错。 3. 调用 UDF 函数

函数创建完成后,可使用函数名 + 匹配类型的参数列表来调用 UDF 函数,例如:

1. select py_add(12345,23456); 2. +-------------------------+ 3. | py_add(12345, 23456) | 4. +-------------------------+ 5. | 35801 | 6. +-------------------------+ 7. 1 row in set (0.02 sec)

删除 UDF

可通过 drop function 命令对已创建的 UDF 函数进行删除。MatrixOne 通过 函数名(参数列表) 来完整标识一个 UDF 函数,因此删除 UDF 函数时需要显式指定函数名与参数列表,例如:

1. drop function py_add(int, int);

查看 UDF

已创建 UDF 函数的信息会保存在 MatrixOne 的元数据中,可通过查询系统表 mo_catalog.mo_user_defined_function 来获取 MatrixOne 中已有的 UDF 详细信息,例如:

1. mysql> select * from mo_catalog.mo_user_defined_function\G
2. *************************** 1. row ***************************
3. function_id: 9000016
4. name: py_add
5. owner: 0
6. args: [{"name": "a", "type": "int"}, {"name": "b", "type": "int"}]
7. rettype: int
8. body: {"handler":"add","import":false,"body":"\ndef add(a, b):\n  return a + b\n"}
9. language: python
10. db: udf_test
11. definer: root
12. modified_time: 2023-12-26 13:59:39
13. created_time: 2023-12-26 13:59:39
14. type: FUNCTION
15. security_type: DEFINER
16. comment:
17. character_set_client: utf8mb4
18. collation_connection: utf8mb4_0900_ai_ci
19. database_collation: utf8mb4_0900_ai_ci

参考文档

有关 MatrixOne 中 UDF 的进阶用法,参见 UDF 进阶用法。

有关 MatrixOne 对 UDF 创建的具体参数,参见创建 UDF。

有关 MatrixOne 对 UDF 删除的具体参数,参见删除 UDF。