Monetdbe Python UDF

Monetdbe Python UDF

鉴于 monetdbe 是一个 Python 包,我很乐观地认为 Python 用户定义的函数是可能的,但我没能找到一个例子.我试过这个:

drop function every_other_letter;

create function every_other_letter(s string)
returns string
language python {
     letters = "".join(s[::2])
     return letters
};

select every_other_letter('foobarbaz');

我收到这个错误:

ParseException:SQLparser:42000!Internal error while compiling statement: TypeException:user.p2_1[4]:'pyapi3.eval' library error in: Embedded Python 3 has not been enabled. Start server with --set embedded_py=3

有没有办法在嵌入式版本中设置这些标志?

LANGUAGE PYTHON UDF 是 MonetDB 服务器安装中的一项很好的开发功能,但此功能需要加载额外的 Python 模块。并且目前无法配置 monetdbe 以加载所需的 python 模块。

然而,假设您对一些生产设置有性能要求,而 monetdbe 中的 out-of-the-box SQL 工具集不满足,那么实现一个用 [=35 编写的自定义 UDF 扩展更有意义=]++。在常规的 MonetDB 服务器安装中,数据库服务器 mserver5 可以使用 --loadmodule=<module> 命令选项加载任意扩展模块。但是目前还没有等价物monetdbe_option

您可以考虑在 monetdbe-python 的 github 存储库中为此添加功能请求。

然而,似乎存在一个有效的未记录的解决方法,用于将 UDF 扩展添加到 monetdbe。在初始化期间,monetdbe 尝试加载一组硬编码模块。其中之一是名为 "udf" 的模块。您可以创建自己的此模块实现并将其加载到 monetdbe.

创建本机 UDF 扩展不在本问答的范围内,但是有一个不错的 up-to-date 教程用于为 MonetDB here 编写 UDF 扩展。按照该教程中描述的步骤,您最终会得到一个 SQL 函数 revstr,它具有用户定义的本机实现。以下 Python 脚本演示了它的用法:

from monetdbe import connect

with connect(autocommit=True) as con:
    cur = cur.execute("select revstr('abcde')")
    result = cur.fetchall()
    print(result)

确保包含您的 UDF 扩展的库位于动态链接器的搜索路径中:

LD_LIBRARY_PATH=<path to directory containing lib_udf> python test.py