加载 UDx

库中包含用户定义扩展 (UDx)。库可包含多个 UDx。要将 UDx 添加到 Vertica,您必须执行下列操作:

  1. 部署库(每个库一次)。

  2. 创建每个 UDx(每个 UDx 一次)。

如果您使用的是用 Java 编写的 UDx,则还必须设置 Java 运行时环境。请参阅在 Vertica 主机上安装 Java

部署库

要将库部署到 Vertica 数据库,请执行下列操作:

  1. 将包含您的函数的 UDx 共享库文件 (.so)、Python 文件、Java JAR 文件或 R 函数文件复制到 Vertica 群集上的节点。您不需要将其复制到每个节点。

  2. 连接到从中复制库的节点(例如使用 vsql)。

  3. 使用 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 FUNCTIONCREATE 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 类的一个实例,并将需要处理的数据提供给该实例。