Vertica 6.x 只支持R、C++编写Vertica的UDF,由于使用内置的String 提供的函数实现不了substring_index功能,且用C++实现
#include <algorithm> #include <string> #include "Vertica.h" using namespace Vertica; using namespace std; // 从text中获取第|delim_num|个|delim|前的全部子串 std::string getSubString(const std::string& text, const std::string& delim, int delim_num) { // 需要0个分隔符 if (delim_num <= 0) { return std::string(); } // 查找第n个分隔符 size_t delim_size = delim.size(); size_t next = 0; do { next = text.find(delim, next); if (next != std::string::npos) { --delim_num; next+=delim_size; } } while (next <= text.size() && delim_num > 0); return text.substr(0, next - delim_size); } /* * */ class SubstringIndex : public ScalarFunction { public: virtual void processBlock(ServerInterface &srvInterface, BlockReader &arg_reader, BlockWriter &res_writer) { if (arg_reader.getNumCols() != 3) vt_report_error(0, "Function only accept 3 arguments, but %zu provided", arg_reader.getNumCols()); // While we have inputs to process try{ do {//C++实现UDF特有的(Java不需要),避免出现:ERROR 5400: User-defined Scalar Function substring_index produced fewer output rows (0) than input rows (1) string src = arg_reader.getStringRef(0).str(); string delim = arg_reader.getStringRef(1).str(); vint occur = arg_reader.getIntRef(2); int tot = occur; string result = getSubString(src,delim,tot); res_writer.getStringRef().copy(result); res_writer.next(); } while (arg_reader.next()); }catch(...){//这里需要捕捉异常,不然Vertica后台会退出,整个db就stop了,PS:C++的异常太复杂,...表示捕捉所有异常 res_writer.getStringRef().copy("OTHER"); } } }; class SubstringIndexFactory : public ScalarFunctionFactory { virtual ScalarFunction *createScalarFunction(ServerInterface &interface) { return vt_createFuncObj(interface.allocator, SubstringIndex); } virtual void getPrototype(ServerInterface &interface, ColumnTypes &argTypes, ColumnTypes &returnType) { argTypes.addVarchar(); argTypes.addVarchar(); argTypes.addInt(); returnType.addVarchar(); } virtual void getReturnType(ServerInterface &srvInterface, const SizedColumnTypes &argTypes, SizedColumnTypes &returnType) { const VerticaType &t = argTypes.getColumnType(0); returnType.addVarchar(t.getStringLength()); } }; RegisterFactory(SubstringIndexFactory);
dwyyproduct=> select substring_index('a/b/c','/',2); substring_index ----------------- a/b (1 row) dwyyproduct=> select substring_index('a/b/c','/',3); substring_index ----------------- a/b/c (1 row) dwyyproduct=> select substring_index('a/b/c','/',4); substring_index ----------------- a/b/c (1 row) dwyyproduct=> select substring_index('a/b/c','/',0); substring_index ----------------- (1 row)
与JAVA实现不同,请注意上述功能代码的注释部分!
编写完cpp,在linux下执行gcc命令
gcc substring_index.cpp Vertica.cpp -I /opt/vertica/sdk/include/ -fPIC -shared -o verticaso.so
/opt/vertica/sdk/include/ 为vertica c++ 的 .h 文件所在位置
verticaso.so 为生成的so文件
使用dbadmin进入vsql,执行
CREATE LIBRARY verticasolib AS '/tmp/verticaso.so' language 'C++'; CREATE FUNCTION substring_index AS LANGUAGE 'C++' NAME 'SubstringIndexFactory' LIBRARY verticasolib;
ALL DONE!
相关推荐
c#实现Vertica数据库的连接及各类操作,包含常规数据库操作方法。以及数据库连接组件Vertica.Data.dll
Java连接数据vertica数据库 就可以连接数据库 import java.sql.*; import java.util.Properties; Properties myProp = new Properties(); //用于设置数据库的用户名 myProp.put("user", "dbadmin"); //用于...
vertica jdbc驱动 不用解释了吧
You can download the Vertica drivers here: https://my.vertica.com/download/vertica/client-drivers/ Once you have the files you want (i.e. vertica-jdbc-9.2.1-0.jar) you should be able to run a ...
Vertica Documentation - Vertica Analytic Database Contents Vertica® 9.1.x Documentation 5 Vertica 9.1.x Supported Platforms 11 Vertica 9.1.x New Features and Changes 39 Vertica Concepts 64 ...
Vertica除了用GUI方式创建数据库外,也可以用如下命令创建数据库: v001:/home/dbadmin $ admintools -t create_db -s v001,v002,v003,v005,v006,v007,v008 -d $DBNAME -p $DBPWD 如下修改vsql所在服务器的 ~/.bash...
Vertica_9.1.x_Complete_Documentation Vertica_9.1.x的完整文档,详细介绍Vertica及其功能,包括安装、管理手册、数据分析、使用控制台、SQL参考手册
Vertica
vertica jdbc driver包含三个版本的驱动,分别是5.6,7.0,8.0
vertica 文档
我用过性能最好的mpp数据库vertica的客户端 vertica 美国hp收购的一个mpp数据库
Vertica 7 JAVA SDK文档
vertica备份恢复方案
Vertica是HP收购的一个列式数据库,在数据分析、挖掘方面很有潜力,特别是对列式数据分析比传统的关系型数据库更有优势。本书是对Vertica的概念、管理等等有比较详细的讲解。(英文版)
vertica培训的ppt ,里面内容包含vertica的介绍,vertica的使用,以及vertica的扩展。可以作为培训的模板ppt
Introduction vertica Architecture_Overview
惠普的数据库Vertica还是很不错,这是少有的教程,网上Vertica的资料比较少,只能看这个他们的内部文档了
很完整的资料, 包括vertica 8.1版本的管理和开发的流程;
vertica安装包RPM第一部分,共计两部分,大小255M,版本9.1.1
vertica 数据库的驱动,如果连接数据库,需要在连接数据库工具中加入这个驱动,才能正常启动