HP Vertica使用java编写user defined function(UDF)嵌入函数

前言:

不管是hive,mysql还是vertica的内置函数,为我们的使用提供了方便,但是功能是远远不够的;

这时候就需要我们通过其他编程语句,写在数据库上运行UDF自定义函数

1 Developing with the Java SDK

1.1  Java SDK支持的功能

【1】

Java支持的数据类型:INTEGER,FLOAT, DATE, CHAR, VARCHAR, BINARY, VARBINARY, NUMERIC, LONG VARCHAR, LONGVARBINARY, and TIMESTAMP data types

【2】

User-Defined Scalar Functions (UDSFs),User-Defined Transform Functions (UDTFs), User-Defined Analytic Functions(UDAnFs), and User-Defined Load (UDLs)

【3】

重载和多态User-Defined Functions,能够处理不同的输入参数;

1.2  支持Java SDKExtension Types

1.2.1  用户自定义标量函数

User-Defined Scalar Functions (UDSFs)

返回一个值(标量),并且每一行的数据,必须有一个返回值。

1.3  Installing Java on Hosts

1.4  Setting up a Java Development Environment

Java support package有两个文件:

【1】/opt/vertica/bin/VerticaSDK.jar:包括了HP Vertica JavaSDK和其他支持文件

【2】/opt/vertica/sdk/BuildInfo.java:包含SDK的版本信息,在用户自定义的JavaUDx JAR files中必须包含这个文件;

 

我们可以把这两个文件复制到开发环境中。

注:两个文件版本必须相同,不能不同版本The BuildInfo.java and VerticaSDK.jar files that you use to compileyour UDx must be from the same SDK version

因此最好在生产环境编译。

 

1.4.1 Compile BuildInfo.java

因为我们需要编译BuildInfo.java到class文件中,所有可以将BuildInfo.java包含在Java UDxJAR library中。如果在生产环境中开发,可以这样:

a.     Copy the BuildInfo.java file toanother location on your host.

b.     If you have root privileges,compile the BuildInfo.java file in place. (Only the root user has privileges towrite files to the /opt/vertica/sdk directory.)

脚本如下:

$ javac -classpath/opt/vertica/bin/VerticaSDK.jar \ /path/BuildInfo.java -d output-directory

output-directory的目录是compileyour UDxs的目录,这样该目录中就存在BuildInfo的class文件了。

 

如果使用eclipse就不需要单独编译,you can include the BuildInfo.java file in your project。

1.5  Compiling and Packaging a Java Library

我们需要编译Java UDx和打成jar包;

1.5.1  Compile Your Java Udx

$ javac -classpath/opt/vertica/bin/VerticaSDK.jar factorySource.java \ [functionSource.java...]-d output-directory

源文件可能包含多个java文件,最好用*.java替换factorySource.java

1.5.2  UDx Class File Organization

编译UDx之后,将它的class文件和BuildInfo.class打成一个jar包;

UDx class的目录结构和包的结构要匹配;

例如:UDx's factory class

      com.mycompany.udfs.Add2ints.

class文件的目录结构为:com/mycompany/udfs

同时,BuildInfo.class必须被复制到com/vertica/sdk这个目录下面。

 

例如:

com/vertica/sdk/BuildInfo.class

com/mycompany/example/Add2intsFactory.classcom/mycompany/example/Add2intsFactory$Add2ints.class

1.5.3  Package Your UDx Into a JAR File

通过命令行打jar包

1.     Change to the root directory ofyour project

2.   

# jar -cvf libname.jar com/vertica/sdk/BuildInfo.class \ packagePath/*.class

1.6  Adding Metadata to Java UDx Libraries

系统表USER_LIBRARIES来查看

selectschema_name,lib_name,author,lib_file_name,sdk_version,lib_version,ischecksumvalid from USER_LIBRARIES;

 

schema_name         lib_name       author           lib_file_name          sdk_version  lib_version   ischecksumvalid

public FlexTableLib HP Vertica     public_FlexTableLib_45035996273720624.so           v7.1.1-3         1.0.0   True

public ApproximateLib      Vertica Systems, Inc.           public_ApproximateLib_45035996273720866.so    v7.1.1-3         1.0      True

TxtIndex        TxtIndexLib               TxtIndex_TxtIndexLib_45035996273720968.so         v7.1.1-3                    True

public CalFeeFactory                     public_CalFeeFactory_45035996281287510.jar       v7.1.1-0                    True

 

添加两步:

To add metadata to your Java UDx library, you create a subclass of theUDXLibrary class that contains your library's metadata. You then include thisclass within your JAR file.

 

=> CREATELIBRARY JavaAdd2IntsLib AS :libfile LANGUAGE 'JAVA';

 CREATE LIBRARY >

=> CREATEFUNCTION JavaAdd2Ints as LANGUAGE 'JAVA' name'com.mycompany.example.Add2IntsFactory' library JavaAdd2IntsLib;

CREATE FUNCTION>

=> \x Expandeddisplay is on. >

=> SELECT * FROMUSER_LIBRARIES WHERE lib_name = 'JavaAdd2IntsLib'

 

 

************************************************************** ** 欢迎转发,注明原文:blog.csdn.net/clark_xu   徐长亮的专栏 ** 谢谢您的支持,欢迎关注微信公众号:clark_blog  **************************************************************



你可能感兴趣的:(java,user,udf,udf,defined,vertica,functio,数据库udf)