我正在尝试通过Rserve实现使用R language的Netezza UDX(因此我使用Rconnection库进行C ++)。目前,我只编写了UDX运行所需的最低限度。
看起来如下:
#define MAIN
// Netezza UDX libraries
#include "udxinc.h"
#include "udxhelpers.h"
// C++ libraries
#include <cstdlib>
#include <cstring>
// external Rserve and R headers
#include "Rconnection.h"
#include "sisocks.h"
using namespace nz::udx::dthelpers;
using namespace nz::udx_ver2;
// extends UDF base class
class My_UDX : public Udf {
public:
Rconnection * rc;
My_UDX(UdxInit *pInit) : Udf(pInit) {
initsocks();
// IP address in place of ...
rc = new Rconnection("...", 6311);
};
~My_UDX() {
delete rc;
}
static Udf* instantiate(UdxInit *pInit);
virtual ReturnValue evaluate();
};
Udf* My_UDX::instantiate(UdxInit *pInit) {
return new My_UDX(pInit);
}
// called once for each row of data during execution
ReturnValue My_UDX::evaluate() {
int32 retval = 15;
NZ_UDX_RETURN_INT32(retval);
}
当我尝试使用SQL查询测试UDX时出现问题。我的查询如下:
SELECT * FROM table_name WHERE My_UDX(table_field) = 1;
这是我收到的错误消息:
Testing...
nzsql -d database_name -u my_username -pw my_password -f sql/test.sql
nzsql:sql/test.sql:1: ERROR: /dev/shm/spuplans/63_1_3.o: undefined symbol: _ZN11RconnectionC1EPKci : loading executable code
make: *** [update] Error 2
如果删除Rconnection对象,UDX可以正常工作。
我已经检查了有关Netezza UDX,Rserve和Rconnection的不同手册,但没有结果。无法找到对此错误的任何解释以及可以采取哪些措施来解决此问题。
然后我假设编译过程可能有问题,包含所需的库和标志。我不熟悉makefile,所以这很有可能。我的makefile看起来像这样:
# list of files
function_name = My_UDX
object_files = $(function_name).o_x86
spu_files = $(function_name).o_spu10
# database connection
db_call = nzsql -d database_name -u my_username -pw my_password -f
# path to directories
lib_dir = /home/nz/libs
r_connection_dir = /home/nz/Rconnection
all: update
update: compile
$(db_call) sql/unload.sql
cp $(object_files) $(lib_dir)
cp $(spu_files) $(lib_dir)
rm -f *.o_spu10 *.o_x86
$(db_call) sql/create.sql
$(db_call) sql/test.sql
compile:
nzudxcompile $(function_name).cpp --args -I$(r_connection_dir)
unload.sql只删除以前加载的函数,create.sql只是创建它。只有在执行带有先前显示的SQL查询的test.sql时才会出现问题。
一直试图解决这个问题很长一段时间,所以任何帮助都会受到赞赏!
答案 0 :(得分:0)
如上所述,Alex必须将Rconnection作为共享库加载或与UDF一起编译。通过使用UDF进行编译解决了这个问题。
# for host environment
nzudxcompile --host Rconnection.cpp -o temp_rconnection.o_x86
nzudxcompile --host myudf.cpp -o temp_myudf.o_x86
nzudxcompile --host --objs temp_rconnection.o_x86 --objs temp_myudf.o_x86 -o myudf.o_x86
# for spu environment
nzudxcompile Rconnection.cpp --spu -o temp_rconnection.o_spu10
nzudxcompile myudf.cpp --spu -o temp_myudf.o_spu10
nzudxcompile --spu --objs temp_rconnection.o_spu10 --objs temp_myudf.o_spu10 -o myudf.o_spu10