Gbase 8a中udf使用和常见问题

通过udf和udaf机制,数据库用户能够使用c/c++语言自行定义开发函数,编译C文件为共享库并部署后,就可以在集群中创建udf和udaf函数并调用,如下:

1 在安装GBase8a的服务器上编译C或C++程序的共享库,如:

gcc -fPIC func_toupper.c -shared -o func_toupper.so

2 将编译好的共享库拷贝到GBase8a安装路径的lib/gbase/plusin下

3 创建白定义函数,如:

gbase> create function func_toupper returns string soname ‘func_toupper.so’;

4调用函数,如:

gbase> select func_toupper(‘abed’) from dual;

实际操作中可能会遇到的问题和解决方法如下:

1.编译时因缺少头文件报错,如:

$ gcc -fPIC arg_return_testl.c-shared -o arg_return_testl.so

arg_return_test1.c:127:26:致命错误:gbase_global.h:没有那个文件或目录

#include <gbase_global.h>

解決方法:将头文件gbase_global.h拷贝后,编译命令后添加”-l 头文件所在目录”如:

$ gcc -fPIC arg_return_testl.c -shared -o arg_return_testl.so -I include_

2,报錯Can’t find symbol..in library

gbase create aggregate function arg_return_test1 returns real soname ‘arg_return_test1.so

ERROR 1704 (HY000): gluster function error: 10.10.11.50:Can’t find symboI ‘arg retum test1’ in library.

udaf函数名、so文件名、so文件中的主函数名需要保持一致,当so文件中函数名与so文

名不统一,或创建的udaf函数名与so文件名不统一时,可能会出现以上报错。

解決方法:如果是so文件中函数名与so文件名不统一,需要修改c/c++文件中主函数名,使用重新编译后的so文件。

3.报错file…not exists

gbase> create function func_toupper_returns real soname ‘func_toupper.so”;

ERROR 1704 (HY000): gcluster function error: file /opt/10.10.11.50/gluster/ server/lib/gbase/plugin/func_toupper.so not exists

创建udf/udaf时需要将共享.so放在plugin目录下,查看参数show variables like ‘plugin_dir’可以得到该目录,单机层和集群层中都要有.so文件,否则报错。只需要拷到执行节点,其他节点自动同步库文件。

4. 如果更新了共享库.so文件,需要删除原来的udf/udaf函数之后重新创建。否则查询中使用的是原来的函数。

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/tech/bigdata/317931.html

(0)
上一篇 1天前
下一篇 1天前

相关推荐

发表回复

登录后才能评论