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数据库进行交互是一种常见的需求,特别是在.NET开发环境中。Vertica是一个高性能、高度可扩展的关系型数据库管理系统,尤其适用于大数据分析。本文将深入探讨如何使用C#来实现对Vertica数据库的连接...
“Extending Vertica”章节讨论了如何通过开发自定义函数、加载器和其他扩展来定制Vertica的功能,以满足特定业务需求。 “Connecting to Vertica”提供了连接到Vertica的各种方法,包括使用JDBC、ODBC驱动程序,...
- 如何在Vertica上进行高级自定义和扩展,可能包括编写自定义函数、存储过程等。 11. **使用云平台上的Vertica**: - Vertica也支持云环境部署,该部分将介绍如何在云服务如AWS、Azure等平台上部署和使用Vertica...
对于开发人员,文档中的API参考章节尤为重要,它提供了关于SQL扩展、存储过程、UDX(用户自定义函数)的详细说明,帮助开发者利用Vertica的强大功能构建定制化的数据处理逻辑。同时,文档还可能涵盖与各种编程语言...
- **扩展Vertica**(第4173页):介绍如何通过自定义函数等手段扩展Vertica的功能。 - **连接到Vertica**(第4439页):涵盖不同编程语言如何连接到Vertica的方法。 - **在云环境中使用Vertica**(第4943页):讨论...
这些版本对应于Vertica数据库的不同发行版,每个版本可能包含特定的性能改进、新功能或对旧功能的优化。选择哪个版本取决于你的应用程序需求和所使用的Vertica数据库版本。 描述中提到的三个版本具体如下: 1. **...
HPE Vertica分析型数据库是一款高性能、大规模并行处理的列式数据库管理系统。它设计用于实时分析和管理海量数据集,支持大数据分析应用,适用于数据仓库、商业智能(BI)以及机器学习分析等场景。下面我们将从手册中...
这些函数可能包括统计函数、时间日期处理函数、字符串操作函数等,并且有专门针对Vertica特性的函数。 文档还详细介绍了系统限制,这对于规划和管理数据库非常重要。例如,一个Vertica数据库在没有官方协助的情况下...
- **内容概览**:介绍了如何通过自定义函数、UDFs(用户定义函数)等方式增强HP Vertica的功能性和灵活性。 #### 十四、连接至HP Vertica - **章节位置**:文档第3711页。 - **内容概览**:涵盖各种编程语言和工具...
Vertica JDBC驱动是连接到Vertica数据库的一种重要工具,它允许Java应用程序通过Java Database Connectivity (JDBC) API与Vertica数据库进行交互。Vertica是一个高性能、可扩展的列式数据库系统,广泛应用于大数据...
10. **Extending Vertica**: 这一部分介绍如何利用Vertica的扩展能力,例如开发自定义函数、加载用户定义的聚合函数(UDAF)和操作符,以及实现数据处理的高级功能。 11. **Using Vertica on the Cloud**: 云使用...
由于该书是英文版,对于中文读者而言,可能需要具备一定的英语阅读能力。本书不仅为数据库管理员提供了实用的部署和管理知识,也向数据分析师展示了如何利用Vertica进行高效的数据分析和挖掘工作。无论对于初学者...
Java连接数据vertica数据库 就可以连接数据库 import java.sql.*; import java.util.Properties; Properties myProp = new Properties(); //用于设置数据库的用户名 myProp.put("user", "dbadmin"); //用于...
**标题:“Vertica Windows客户端”** **描述:**Vertica是一种高性能的多处理(MPP)数据库系统,由美国HP公司收购。它以其出色的查询速度、大规模数据处理能力和高可用性而受到赞誉。作为Vertica的客户端,它为用户...
惠普公司开发的HP Vertica数据库是一款面向分析的列式数据库管理系统,它支持大规模数据集的存储和高速查询。因其卓越的性能和高可靠性,Vertica数据库在大数据分析领域中备受关注。文档《HP_Vertica数据库从入门到...
Vertica 9.1版本的官方文档是Micro Focus公司发布的Vertica分析数据库的指南,它提供了从配置到使用的一系列信息和细节。Vertica是一个列式数据库管理系统,专门设计用来进行大规模的数据分析,具备高性能和可伸缩性...
### Vertica 7 JAVA SDK 知识点解析 #### 标题:Vertica 7 JAVA SDK **Vertica 7 JAVA SDK** 是一款为HP Vertica数据库设计的Java开发工具包,它允许开发者通过Java应用程序与HP Vertica数据库进行交互。 #### ...
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 ...
- **自定义函数**:支持用户自定义 SQL 函数,提高查询灵活性。 - **存储过程**:支持编写复杂的业务逻辑,增强数据处理能力。 - **触发器**:能够在特定事件发生时自动执行 SQL 语句。 #### 六、案例与实践 - **...
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 ...