`
yugouai
  • 浏览: 498598 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

vertica自定义函数C++版

 
阅读更多

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数据库的连接及各类操作

    在C#中与Vertica数据库进行交互是一种常见的需求,特别是在.NET开发环境中。Vertica是一个高性能、高度可扩展的关系型数据库管理系统,尤其适用于大数据分析。本文将深入探讨如何使用C#来实现对Vertica数据库的连接...

    Vertica_9.1.x完整文档

    “Extending Vertica”章节讨论了如何通过开发自定义函数、加载器和其他扩展来定制Vertica的功能,以满足特定业务需求。 “Connecting to Vertica”提供了连接到Vertica的各种方法,包括使用JDBC、ODBC驱动程序,...

    vertica 8.1 完整文档

    - 如何在Vertica上进行高级自定义和扩展,可能包括编写自定义函数、存储过程等。 11. **使用云平台上的Vertica**: - Vertica也支持云环境部署,该部分将介绍如何在云服务如AWS、Azure等平台上部署和使用Vertica...

    vertica文档

    对于开发人员,文档中的API参考章节尤为重要,它提供了关于SQL扩展、存储过程、UDX(用户自定义函数)的详细说明,帮助开发者利用Vertica的强大功能构建定制化的数据处理逻辑。同时,文档还可能涵盖与各种编程语言...

    vertica安装文档,9.1.1版本

    - **扩展Vertica**(第4173页):介绍如何通过自定义函数等手段扩展Vertica的功能。 - **连接到Vertica**(第4439页):涵盖不同编程语言如何连接到Vertica的方法。 - **在云环境中使用Vertica**(第4943页):讨论...

    vertica jdbc driver 驱动下载

    这些版本对应于Vertica数据库的不同发行版,每个版本可能包含特定的性能改进、新功能或对旧功能的优化。选择哪个版本取决于你的应用程序需求和所使用的Vertica数据库版本。 描述中提到的三个版本具体如下: 1. **...

    vertica中文手册(7.2)

    HPE Vertica分析型数据库是一款高性能、大规模并行处理的列式数据库管理系统。它设计用于实时分析和管理海量数据集,支持大数据分析应用,适用于数据仓库、商业智能(BI)以及机器学习分析等场景。下面我们将从手册中...

    vertica V11.1官方SQL开发指导文档 英文版

    这些函数可能包括统计函数、时间日期处理函数、字符串操作函数等,并且有专门针对Vertica特性的函数。 文档还详细介绍了系统限制,这对于规划和管理数据库非常重要。例如,一个Vertica数据库在没有官方协助的情况下...

    HP Vertica 8.0 完全管理员手册 英文版

    - **内容概览**:介绍了如何通过自定义函数、UDFs(用户定义函数)等方式增强HP Vertica的功能性和灵活性。 #### 十四、连接至HP Vertica - **章节位置**:文档第3711页。 - **内容概览**:涵盖各种编程语言和工具...

    vertica jdbc 驱动driver

    Vertica JDBC驱动是连接到Vertica数据库的一种重要工具,它允许Java应用程序通过Java Database Connectivity (JDBC) API与Vertica数据库进行交互。Vertica是一个高性能、可扩展的列式数据库系统,广泛应用于大数据...

    HP Vertica v11.1官方文档完全版

    10. **Extending Vertica**: 这一部分介绍如何利用Vertica的扩展能力,例如开发自定义函数、加载用户定义的聚合函数(UDAF)和操作符,以及实现数据处理的高级功能。 11. **Using Vertica on the Cloud**: 云使用...

    HP Vertica Essentials

    由于该书是英文版,对于中文读者而言,可能需要具备一定的英语阅读能力。本书不仅为数据库管理员提供了实用的部署和管理知识,也向数据分析师展示了如何利用Vertica进行高效的数据分析和挖掘工作。无论对于初学者...

    vertica数据库的连接jar包

    Java连接数据vertica数据库 就可以连接数据库 import java.sql.*; import java.util.Properties; Properties myProp = new Properties(); //用于设置数据库的用户名 myProp.put("user", "dbadmin"); //用于...

    vertica windows客户端

    **标题:“Vertica Windows客户端”** **描述:**Vertica是一种高性能的多处理(MPP)数据库系统,由美国HP公司收购。它以其出色的查询速度、大规模数据处理能力和高可用性而受到赞誉。作为Vertica的客户端,它为用户...

    HP_Vertica数据库从入门到精通

    惠普公司开发的HP Vertica数据库是一款面向分析的列式数据库管理系统,它支持大规模数据集的存储和高速查询。因其卓越的性能和高可靠性,Vertica数据库在大数据分析领域中备受关注。文档《HP_Vertica数据库从入门到...

    Vertica_9.1文档

    Vertica 9.1版本的官方文档是Micro Focus公司发布的Vertica分析数据库的指南,它提供了从配置到使用的一系列信息和细节。Vertica是一个列式数据库管理系统,专门设计用来进行大规模的数据分析,具备高性能和可伸缩性...

    Vertica 7 JAVA SDK

    ### Vertica 7 JAVA SDK 知识点解析 #### 标题:Vertica 7 JAVA SDK **Vertica 7 JAVA SDK** 是一款为HP Vertica数据库设计的Java开发工具包,它允许开发者通过Java应用程序与HP Vertica数据库进行交互。 #### ...

    vertica-jdbc-9.2.1-0.jar

    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 sql

    - **自定义函数**:支持用户自定义 SQL 函数,提高查询灵活性。 - **存储过程**:支持编写复杂的业务逻辑,增强数据处理能力。 - **触发器**:能够在特定事件发生时自动执行 SQL 语句。 #### 六、案例与实践 - **...

    Vertica 分析型数据库完全参考文档

    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 ...

Global site tag (gtag.js) - Google Analytics