TransformFunction 类

您可以在 TransformFunction 类中执行数据处理,以及将输入行转换为输出行。子类必须定义 processPartition() 方法。该类可定义多种方法以设置和分解该函数。

执行转换

processPartition() 方法可执行您希望 UDTF 执行的所有处理。当用户在 SQL 语句中调用您的函数时,Vertica 会将来自函数参数的数据绑定在一起并将其传递至 processPartition()

processPartition() 方法的输入和输出由 PartitionReaderPartitionWriter 类的对象提供。这些类定义了用于为 UDTF 读取输入数据和写入输出数据的方法。

UDTF 不一定像 UDSF 那样对单行进行操作。UDTF 可以随时读取任意数量的行并写入输出。

在实施 processPartition() 时,请遵循以下准则:

  • PartitionReader 对象中调用特定于数据类型的函数以提取每个输入参数。这些函数全部使用一个参数:要读取的输入行的列号。函数可能需要处理 NULL 值。

  • 写入输出时,UDTF 必须提供在工厂中定义的所有输出列的值。与读取输入列类似,PartitionWriter 对象具备将每种类型的数据写入输出行的函数。

  • 请使用 PartitionReader.next() 确定是否还有更多输入需要处理,并在输入处理完时退出。

  • 在某些情况下,您可能需要使用 PartitionReadergetNumCols()getTypeMetaData() 函数来确定参数的数量和类型,而非仅对输入行中列的数据类型进行硬编码。如果希望 TransformFunction 能够处理具有不同架构的输入表,则此方法很有用。然后,您可以使用不同的 TransformFunctionFactory 类定义调用同一个 TransformFunction 类的多个函数签名。有关详细信息,请参阅重载 UDx

设置和分解

TransformFunction 类定义了两种其他方法,您可以选择性地实施这两种方法以分配和释放资源: setup()destroy()。您应使用这些方法来分配和取消分配那些不通过 UDx API 分配的资源(有关详细信息,请参阅为 UDx 分配资源)。

API

TransformFunction API 提供了以下通过子类扩展的方法:

virtual void setup(ServerInterface &srvInterface,
        const SizedColumnTypes &argTypes);

virtual void processPartition(ServerInterface &srvInterface,
        PartitionReader &input_reader, PartitionWriter &output_writer)=0;

virtual void cancel(ServerInterface &srvInterface);

virtual void destroy(ServerInterface &srvInterface,
        const SizedColumnTypes &argTypes);

PartitionReaderPartitionWriter 类会为列值提供 getter 和 setter,以及用于遍历分区的 next()。有关详细信息,请参阅 API 参考文档。

TransformFunction API 提供了以下通过子类扩展的方法:

public void setup(ServerInterface srvInterface, SizedColumnTypes argTypes);

public abstract void processPartition(ServerInterface srvInterface,
        PartitionReader input_reader, PartitionWriter input_writer)
    throws UdfException, DestroyInvocation;

protected void cancel(ServerInterface srvInterface);

public void destroy(ServerInterface srvInterface, SizedColumnTypes argTypes);

PartitionReaderPartitionWriter 类会为列值提供 getter 和 setter,以及用于遍历分区的 next()。有关详细信息,请参阅 API 参考文档。

TransformFunction API 提供了以下通过子类扩展的方法:


def setup(self, server_interface, col_types)

def processPartition(self, server_interface, partition_reader, partition_writer)

def destroy(self, server_interface, col_types)

PartitionReaderPartitionWriter 类会为列值提供 getter 和 setter,以及用于遍历分区的 next()。有关详细信息,请参阅 API 参考文档。

实施 主函数 API 以定义转换函数:

FunctionName <- function(input.data.frame, parameters.data.frame) {
  # Computations

  # The function must return a data frame.
  return(output.data.frame)
}