跳到主要内容
版本:Candidate-3.4

Python UDF

自 3.4.0 版本起,StarRocks 支持使用 Python 语言编写用户定义函数(User Defined Function,简称 UDF)。

本文介绍如何编写和使用 StarRocks Python UDF。

目前 StarRocks Python UDF 仅支持用户自定义标量函数(Scalar UDF)。

前提条件

使用 StarRocks 的 Python UDF 功能前,您需要:

  • 安装 Python3.8+ 以运行Python。
  • 开启 UDF 功能。在 FE 配置文件 fe/conf/fe.conf 中设置配置项 enable_udftrue,并重启 FE 节点使配置项生效。详细操作以及配置项列表参考配置参数
  • BE 设置Python解释器环境变量位置。添加配置项 python_envs 设置为 Python解释器安装位置例如 /opt/Python-3.8/

开发并使用 Python UDF

开发 Scalar UDF

语法

CREATE [GLOBAL] FUNCTION function_name(arg_type [, ...])
RETURNS return_type
[PROPERTIES ("key" = "value" [, ...]) | key="value" [...] ]
[AS $$ $$]

创建 Python inline Scalar input UDF

echo 示例

CREATE FUNCTION python_echo(INT) RETURNS
INT
type = 'Python'
symbol = 'echo'
file = 'inline'
AS
$$
def echo(x):
return x
$$
;
参数描述
symbolUDF 执行函数。
type用于标记所创建的 UDF 类型,在Python UDF中。取值为 Python,表示基于 Python 的 UDF。
input输入类型,取值为"scalar"和"arrow", 默认值为 "scalar"

创建 Python inline vectorized input UDF

为了提升UDF处理速度,提供了vectorized input

CREATE FUNCTION python_add(INT) RETURNS
INT
type = 'Python'
symbol = 'add'
input = "arrow"
AS
$$
import pyarrow.compute as pc
def add(x):
return pc.add(x, 1)
$$
;

创建 Python packaged input UDF

打包创建: 首先把module 打包到 xxx.zip,需要满足 zipimport 格式

> tree .
.
├── main.py
└── yaml
├── composer.py
├── constructor.py
├── cyaml.py
├── dumper.py
├── emitter.py
├── error.py
├── events.py
├── __init__.py
├── loader.py
├── nodes.py
├── parser.py
> cat main.py 
import numpy
import yaml

def echo(a):
return yaml.__version__
CREATE FUNCTION py_pack(string) 
RETURNS string
symbol = "add"
type = "Python"
file = "http://HTTP_IP:HTTP_PORT/m1.py.zip"
symbol = "main.echo"
;

注意URL这里一定是要以 .py.zip 结尾

类型映射关系

SQL TypePython 3 Type
SCALAR:
TINYINT/SMALLINT/INT/BIGINT/LARGEINTINT
STRINGstring
DOUBLEFLOAT
BOOLEANBOOL
DATETIMEDATETIME.DATETIME
FLOATFLOAT
CHARSTRING
VARCHARSTRING
DATEDATETIME.DATE
DECIMALDECIMAL.DECIMAL
ARRAYList
MAPDict
STRUCTCOLLECTIONS.NAMEDTUPLE
JSONdict
VECTORIZED:
TYPE_BOOLEANpyarrow.lib.BoolArray
TYPE_TINYINTpyarrow.lib.Int8Array
TYPE_SMALLINTpyarrow.lib.Int15Array
TYPE_INTpyarrow.lib.Int32Array
TYPE_BIGINTpyarrow.lib.Int64Array
TYPE_FLOATpyarrow.FloatArray
TYPE_DOUBLEpyarrow.DoubleArray
VARCHARpyarrow.StringArray
DECIMALpyarrow.Decimal128Array
DATEpyarrow.Date32Array
TYPE_TIMEpyarrow.TimeArray
ARRAYpyarrow.ListArray