前言:
不管是hive,mysql还是vertica的内置函数,为我们的使用提供了方便,但是功能是远远不够的;
这时候就需要我们通过其他编程语句,写在数据库上运行UDF自定义函数
【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,能够处理不同的输入参数;
User-Defined Scalar Functions (UDSFs)
返回一个值(标量),并且每一行的数据,必须有一个返回值。
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
因此最好在生产环境编译。
因为我们需要编译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。
我们需要编译Java UDx和打成jar包;
$ javac -classpath/opt/vertica/bin/VerticaSDK.jar factorySource.java \ [functionSource.java...]-d output-directory
源文件可能包含多个java文件,最好用*.java替换factorySource.java
编译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
通过命令行打jar包
1. Change to the root directory ofyour project
2.
# jar -cvf libname.jar com/vertica/sdk/BuildInfo.class \ packagePath/*.class
系统表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'