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)
}