开发用户定义的扩展 (UDx)

用户定义的扩展 (UDx) 是包含在外部库中的函数,它们使用 Vertica SDK 以 C++、Python、Java 或 R 语言开发而成。外部库是在 Vertica 编录中使用 CREATE LIBRARY 语句定义的。它们最适用于难以用 SQL 执行的分析操作或者需要足够频繁地执行但速度成为主要问题的分析操作。

UDx 的主要优势如下:

  • 它们能够在任何可以使用内部函数的地方使用。

  • 它们充分利用 Vertica 的分布式计算功能。扩展通常在群集中的每个节点上并行执行。

  • 它们由 Vertica 分发到所有节点。您只需要将库复制到启动程序节点。

  • 开发分布式分析代码块的所有复杂方面均由 Vertica 为您处理。您的主要编程任务是读入并处理数据,然后使用 Vertica SDK API 写出该数据。

您需要谨记以下有关开发 UDx 的几个要点:

  • 可以采用编程语言开发 UDx:C++、Python、Java 和 R(并非所有 UDx 类型均支持全部语言)。

  • 在 Java 中编写的 UDx 始终在隔离模式下运行,因为执行 Java 程序的 Java 虚拟机无法直接在 Vertica 进程中运行。

  • 以 Python 编写的 UDx 和 R 函数始终在隔离模式下运行。

  • 在 C++ 中开发的 UDx 提供了在非隔离模式下运行的选项,这意味着它们直接加载到 Vertica 数据库进程并在其中运行。此选项可提供最小开销和最高速度。但是,UDx 代码中的任何缺陷会导致数据库不稳定。部署到实时环境之前,您必须全面测试计划在非隔离模式下运行的任何 UDx。应考虑在非隔离模式下运行 C++ UDx 所实现的性能提升是否抵得上有缺陷 UDx 可能会导致的数据库不稳定性。

  • 由于 UDx 在 Vertica 群集上运行,因此它会从数据库进程夺取处理器时间和内存。使用大量计算资源的 UDx 会对数据库性能造成负面影响。

UDx 的类型

Vertica 支持五种类型的用户定义的扩展:

  • 用户定义的标量函数 (UDSF) 接受单个数据行并返回单个值。这些函数能够在任何可以使用原生函数的地方使用,但不能在 CREATE TABLE BY PARTITION 和 SEGMENTED BY 表达式中使用。可以采用 C++、Python、Java 和 R 开发 UDSF。

  • 使用用户定义的聚合函数 (UDAF),可以创建特定于您的需求的自定义 聚合函数。它们读取一个数据列,并返回一个输出列。可以采用 C++ 开发 UDAF。

  • 用户定义的分析函数 (UDAnF) 与 UDSF 相似,它们也读取一个数据行并返回单个行。但是,这种函数可以仅读取输入行而不输出行,以便可以基于多个输入行计算输出值。该函数可以与查询的 OVER() 子句一起使用,以便对行进行分区。可以采用 C++ 和 Java 开发 UDAnF。

  • 用户定义的转换函数 (UDTF) 对表分区进行操作(由查询的 OVER() 子句指定),并返回零个或更多数据行。它们返回的数据可以是与输入表的架构毫无关联的全新表,具有自己的排序和分段表达式。它们可在查询的 SELECT 列表中使用。可以采用 C++、Python、Java 和 R 开发 UDTF。

    要优化查询性能,您可以使用实时聚合投影对 UDTF 返回的数据进行预聚合。有关详细信息,请参阅预聚合 UDTF 结果

  • 用户定义的加载,可以创建用于加载数据的自定义资源筛选器解析器。这些扩展可以用在 COPY 语句中。UDL可以开发 C++、Java 和 Python。

虽然每种 UDx 类型具有唯一的基本类,但它们的开发过程有许多相似之处。不同类型的 UDx 还可以共用同一个库。

结构

每个 UDx 类型包含两个主类。主类执行实际工作(转换和聚合等)。此类通常具有至少三种方法:一种用于设置,一种用于拆解(释放预留资源),另一种用于执行工作。有时还会定义其他方法。

主要处理方法接收 ServerInterface 类的实例作为实参。底层 Vertica SDK 代码使用此对象向 Vertica 进程发出回调,例如分配内存。您可以使用此类在 UDx 执行期间写入服务器日志。

第二个类是个单例工厂。此类定义了一种用于生成第一个类的实例的方法,并且可能定义用于管理参数的其他方法。

实施 UDx 时,您必须将这两个类子类化。

约定

C++、Python 和 Java API 几乎相同。在可能的情况下,本指南在介绍这些接口时不考虑语言。特定于语言的各节涵盖了特定于 C++、Python 或 Java 的文档。

由于部分文档与语言无关,因此无法始终使用基于语言的最合适术语。本文档使用术语“方法”来指 Java 方法或 C++ 成员函数。

另请参阅

加载 UDx