定 义函数
协处理器注释
@coprocessor
注释指定一个 python 函数作为 GreptimeDB 的协处理器,并为其设置一些属性。
该引擎允许一个且仅有一个用 @coprocessor
注释的函数,不能在一个脚本中拥有一个以上的协处理器。
Parameter | Description | Example |
---|---|---|
sql | Optional. The SQL statement that the coprocessor function will query data from the database and assign them to input args . | @copr(sql="select * from cpu", ..) |
args | Optional. The argument names that the coprocessor function will be taken as input, which are the columns in query results by sql . | @copr(args=["cpu", "mem"], ..) |
returns | The column names that the coprocessor function will return. The Coprocessor Engine uses it to generate the output schema. | @copr(returns=["add", "sub", "mul", "div"], ..) |
backend | Optional. The coprocessor function will run on available engines like rspy and pyo3 , which are associated with RustPython Backend and CPython Backend respectively. The default engine is set to rspy . | @copr(backend="rspy", ..) |
sql
和 args
都是可选的;它们必须都可用,或都不可用,并通常在后查询处理中被使用,详情请阅读下文。
returns
是每个 coprocessor 都需要的,因为输出模式必然存在。
因为 RustPython
不能支持 C 语言 API,当尝试使用 pyo3
后端来使用只支持 C 语言 API 的第三方 python 库时,例如 numpy
,pandas
等,backend
则是必要的。
协处理器函数的输入
该协处理器也接受之前已经看到的参数:
@coprocessor(args=["number"], sql="select number from numbers limit 20", returns=["value"])
def normalize(v) -> vector[i64]:
return [normalize0(x) for x in v]
参数 v
是执行 sql
返回的查询结果中的 number
列(由 args
属性指定)。
当然,也可以有多个参数:
@coprocessor(args=["number", "number", "number"],
sql="select number from numbers limit 5",
returns=["value"])
def normalize(n1, n2, n3) -> vector[i64]:
# returns [0,1,8,27,64]
return n1 * n2 * n3
除了 args
,还可以向协处理器传递用户定义的参数:
@coprocessor(returns=['value'])
def add(**params) -> vector[i64]:
a = params['a']
b = params['b']
return int(a) + int(b)
然后从 HTTP API 传递 a
和 b
:
curl -XPOST \
"http://localhost:4000/v1/run-script?name=add&db=public&a=42&b=99"
{
"code": 0,
"output": [
{
"records": {
"schema": {
"column_schemas": [
{
"name": "value",
"data_type": "Int64"
}
]
},
"rows": [
[
141
]
]
}
}
],
"execution_time_ms": 0
}
将 a=42&b=99
作为查询参数传入HTTP API,返回结果 141
。
用户定义的参数必须由协处理器中的 **kwargs
来完成,其类型都是字符串。可以传递任何想要的东西,如在协处理器中运行的 SQL。