TransformFunction 类
您可以在 TransformFunction
类中执行数据处理,以及将输入行转换为输出行。子类必须定义 processPartition()
方法。该类可定义多种方法以设置和分解该函数。
执行转换
processPartition()
方法可执行您希望 UDTF 执行的所有处理。当用户在 SQL 语句中调用您的函数时,Vertica 会将来自函数参数的数据绑定在一起并将其传递至 processPartition()
。
processPartition()
方法的输入和输出由 PartitionReader
和 PartitionWriter
类的对象提供。这些类定义了用于为 UDTF 读取输入数据和写入输出数据的方法。
UDTF 不一定像 UDSF 那样对单行进行操作。UDTF 可以随时读取任意数量的行并写入输出。
在实施 processPartition()
时,请遵循以下准则:
-
在
PartitionReader
对象中调用特定于数据类型的函数以提取每个输入参数。这些函数全部使用一个参数:要读取的输入行的列号。函数可能需要处理 NULL 值。 -
写入输出时,UDTF 必须提供在工厂中定义的所有输出列的值。与读取输入列类似,
PartitionWriter
对象具备将每种类型的数据写入输出行的函数。 -
请使用
PartitionReader.next()
确定是否还有更多输入需要处理,并在输入处理完时退出。 -
在某些情况下,您可能需要使用
PartitionReader
的getNumCols()
和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);
PartitionReader
和 PartitionWriter
类会为列值提供 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);
PartitionReader
和 PartitionWriter
类会为列值提供 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)
PartitionReader
和 PartitionWriter
类会为列值提供 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)
}