加载 UDx
库中包含用户定义扩展 (UDx)。库可包含多个 UDx。要将 UDx 添加到 Vertica,您必须执行下列操作:
-
部署库(每个库一次)。
-
创建每个 UDx(每个 UDx 一次)。
如果您使用的是用 Java 编写的 UDx,则还必须设置 Java 运行时环境。请参阅在 Vertica 主机上安装 Java。
部署库
要将库部署到 Vertica 数据库,请执行下列操作:
-
将包含您的函数的 UDx 共享库文件 (
.so
)、Python 文件、Java JAR 文件或 R 函数文件复制到 Vertica 群集上的节点。您不需要将其复制到每个节点。 -
连接到从中复制库的节点(例如使用 vsql)。
-
使用 CREATE LIBRARY 语句将库添加到数据库编录。
=> CREATE LIBRARY libname AS '/path_to_lib/filename' LANGUAGE 'language';
libname 是要用来引用库的名称,path_to_lib/filename 是复制到主机的库或 JAR 文件的完全限定路径,language 是实施语言。
例如,如果创建一个名为
TokenizeStringLib.jar
的 JAR 文件,然后将其复制到数据库管理员帐户的主目录,将使用此命令加载库:=> CREATE LIBRARY tokenizelib AS '/home/dbadmin/TokenizeStringLib.jar' LANGUAGE 'Java';
可以将任意数量的库加载到 Vertica。
权限
超级用户可以创建、修改和删除任何库。具有 UDXDEVELOPER 角色或显式授权的用户也可以对库进行操作,如下表所示:
创建 UDx 函数
加载库之后,您可以使用 SQL 语句(例如 CREATE FUNCTION 和 CREATE SOURCE)定义各个 UDx。这些语句将 SQL 函数名分配给库中的扩展类。它们会将 UDx 添加到数据库编录,并在数据库重新启动后保持可用。
所使用的语句取决于要声明的 UDx 的类型,如下表所示:
如果给定名称的 UDx 已存在,您可以替换它或指示 Vertica 不替换它。要替换它,请使用 OR REPLACE 语法,如下例所示:
=> CREATE OR REPLACE TRANSFORM FUNCTION tokenize
AS LANGUAGE 'C++' NAME 'TokenFactory' LIBRARY TransformFunctions;
CREATE TRANSFORM FUNCTION
您可能希望替换现有函数以在隔离和非隔离模式之间进行切换。
或者,如果该函数已经存在,您可以使用 IF NOT EXISTS 来防止再次创建该函数。您可能希望在需要并因此加载 UDx 的升级或测试脚本中使用它。通过使用 IF NOT EXISTS,您可以保留包括隔离状态在内的原始定义。以下示例显示了此语法:
--- original creation:
=> CREATE TRANSFORM FUNCTION tokenize
AS LANGUAGE 'C++' NAME 'TokenFactory' LIBRARY TransformFunctions NOT FENCED;
CREATE TRANSFORM FUNCTION
--- function is not replaced (and is still unfenced):
=> CREATE TRANSFORM FUNCTION IF NOT EXISTS tokenize
AS LANGUAGE 'C++' NAME 'TokenFactory' LIBRARY TransformFunctions FENCED;
CREATE TRANSFORM FUNCTION
将 UDx 添加到数据库之后,您便可以在 SQL 语句中使用扩展。数据库超级用户能够向用户授予 UDx 访问权限。有关详细信息,请参阅GRANT(用户定义的扩展)。
只要您调用 UDx,Vertica 就会在群集中的每个节点上创建 UDx 类的一个实例,并将需要处理的数据提供给该实例。