处理 Java UDx 依赖项
如果 Java UDx 依赖一个或多个外部库,您可以通过以下三种方法之一处理依赖项:
-
使用工具(例如,One-JAR 或 Eclipse Runnable JAR Export Wizard)将 JAR 文件捆绑到 UDx JAR 文件中。
-
将 JAR 文件解包,然后将其内容重新打包到 UDx 的 JAR 文件中。
-
将库复制到 Vertica 群集和 UDx 库。然后使用 CREATE LIBRARY 语句的 DEPENDS 关键字向 Vertica 说明 UDx 库依赖外部库。此关键字用作特定于库的 CLASSPATH 设置。Vertica 会将支持库分发给群集中的所有节点,并设置 UDx 的类路径以便能够找到这些支持库。
如果 UDx 依赖本地库(SO 文件),请使用 DEPENDS 关键字指定其路径。调用 UDx 中的 System.loadLibrary(使用本地库之前必须执行此操作)时,此函数使用 DEPENDS 路径来查找这些库。您不需要另外设置 LD_LIBRARY_PATH 环境变量。
外部库示例
以下示例演示了将外部库与 Java UDx 结合使用。
以下示例代码定义了一个名为 VowelRemover
的简单类。此类包含名为 removevowels
的单个方法,该方法将从字符串中移除所有元音字母(字母 a、e、i、o、u 和 y)。
package com.mycompany.libs;
public class VowelRemover {
public String removevowels(String input) {
return input.replaceAll("(?i)[aeiouy]", "");
}
};
可以使用以下命令编译此类并将其打包到 JAR 文件中:
$ javac -g com/mycompany/libs/VowelRemover.java
$ jar cf mycompanylibs.jar com/mycompany/libs/VowelRemover.class
以下代码定义了一个名为 DeleteVowels
Java UDSF,它使用在以上示例代码中定义的库。 DeleteVowels
接受单个 VARCHAR 作为输入,并返回 VARCHAR。
package com.mycompany.udx;
// Import the support class created earlier
import com.mycompany.libs.VowelRemover;
// Import the Vertica SDK
import com.vertica.sdk.*;
public class DeleteVowelsFactory extends ScalarFunctionFactory {
@Override
public ScalarFunction createScalarFunction(ServerInterface arg0) {
return new DeleteVowels();
}
@Override
public void getPrototype(ServerInterface arg0, ColumnTypes argTypes,
ColumnTypes returnTypes) {
// Accept a single string and return a single string.
argTypes.addVarchar();
returnTypes.addVarchar();
}
@Override
public void getReturnType(ServerInterface srvInterface,
SizedColumnTypes argTypes,
SizedColumnTypes returnType){
returnType.addVarchar(
// Output will be no larger than the input.
argTypes.getColumnType(0).getStringLength(), "RemovedVowels");
}
public class DeleteVowels extends ScalarFunction
{
@Override
public void processBlock(ServerInterface arg0, BlockReader argReader,
BlockWriter resWriter) throws UdfException, DestroyInvocation {
// Create an instance of the VowelRemover object defined in
// the library.
VowelRemover remover = new VowelRemover();
do {
String instr = argReader.getString(0);
// Call the removevowels method defined in the library.
resWriter.setString(remover.removevowels(instr));
resWriter.next();
} while (argReader.next());
}
}
}
可以使用以下命令构建示例 UDSF 并将其打包到 JAR 中:
-
第一个 javac 命令可编译 SDK 的
BuildInfo
类。Vertica 要求所有 UDx 库包含此类。此javac
命令的 -d 选项可在 UDSF 源的目录结构中输出类文件。 -
第二个
javac
命令可编译 UDSF 类。此命令可将先前创建的mycompanylibs.jar
文件添加到类路径,以便编译器能够找到VowelRemover
类。 -
jar
命令可将BuildInfo
和 UDx 库的类打包到一起。
$ javac -g -cp /opt/vertica/bin/VerticaSDK.jar\
/opt/vertica/sdk/com/vertica/sdk/BuildInfo.java -d .
$ javac -g -cp mycompanylibs.jar:/opt/vertica/bin/VerticaSDK.jar\
com/mycompany/udx/DeleteVowelsFactory.java
$ jar cf DeleteVowelsLib.jar com/mycompany/udx/*.class \
com/vertica/sdk/*.class
要安装 UDx 库,您必须将两个 JAR 文件同时复制到 Vertica 群集中的节点。然后连接到该节点以执行 CREATE LIBRARY 语句。
以下示例演示了如何在复制 JAR 文件之后将 UDx 库加载到 dbadmin 用户的主目录。DEPENDS 关键字可向 Vertica 说明 UDx 库依赖 mycompanylibs.jar
文件。
=> CREATE LIBRARY DeleteVowelsLib AS
'/home/dbadmin/DeleteVowelsLib.jar' DEPENDS '/home/dbadmin/mycompanylibs.jar'
LANGUAGE 'JAVA';
CREATE LIBRARY
=> CREATE FUNCTION deleteVowels AS language 'java' NAME
'com.mycompany.udx.DeleteVowelsFactory' LIBRARY DeleteVowelsLib;
CREATE FUNCTION
=> SELECT deleteVowels('I hate vowels!');
deleteVowels
--------------
ht vwls!
(1 row)