AnalyticFunction 类
AnalyticFunction
类可执行分析处理。子类必须定义用于执行操作的 processPartition()
方法。该类可定义多种方法以设置和分解该函数。
执行操作
processPartition()
方法可读取数据分区,执行某种处理,以及为每个输入行输出单个值。
Vertica 将为每个数据分区调用 processPartition()
一次。它使用 AnalyticPartitionReader
对象来提供分区,您可以从该对象读取输入数据。此外,该对象上存在名为 isNewOrderByKey()
的唯一方法,此方法可返回布尔值以指示函数是否已发现具有一个或多个相同 ORDER BY 键的行。此方法对分析函数(例如示例 RANK 函数)很有用,分析函数需要以不同方式处理具有相同 ORDER BY 键的行和具有不同 ORDER BY 键的行。
注意
您可以在用来调用 UDAnF 的 SQL 查询中指定多个 ORDER BY 列。如果任何 ORDER BY 键与上一行不同,isNewOrderByKey
方法将返回 true。
方法已完成处理数据行之后,您可以通过对 AnalyticPartitionReader
调用 next()
使其前进到下一个输入行。
方法使用 Vertica 作为参数提供给 processPartition()
的 AnalyticPartitionWriter
对象来写入输出值。此对象具有特定于数据类型的方法(例如 setInt()
)用于写入输出值。设置输出值之后,对 AnalyticPartitionWriter
调用 next()
以前进到下一个输出行。
注意
您必须确保函数为分区中的每个输入行生成一个输出行。此外,不得输出比分区中更多的行,否则 zygote 大小进程(如果在隔离和非隔离模式下运行)或 Vertica 本身会生成超过边界错误。设置和分解
AnalyticFunction
类定义了两种其他方法,您可以选择性地实施这两种方法以分配和释放资源: setup()
和 destroy()
。您应使用这些方法来分配和取消分配那些不通过 UDx API 分配的资源(有关详细信息,请参阅为 UDx 分配资源)。
API
AnalyticFunction API 提供了以下通过子类扩展的方法:
virtual void setup(ServerInterface &srvInterface,
const SizedColumnTypes &argTypes);
virtual void processPartition (ServerInterface &srvInterface,
AnalyticPartitionReader &input_reader,
AnalyticPartitionWriter &output_writer)=0;
virtual void cancel(ServerInterface &srvInterface);
virtual void destroy(ServerInterface &srvInterface, const SizedColumnTypes &argTypes);
AnalyticFunction API 提供了以下通过子类扩展的方法:
public void setup(ServerInterface srvInterface, SizedColumnTypes argTypes);
public abstract void processPartition (ServerInterface srvInterface,
AnalyticPartitionReader input_reader, AnalyticPartitionWriter output_writer)
throws UdfException, DestroyInvocation;
protected void cancel(ServerInterface srvInterface);
public void destroy(ServerInterface srvInterface, SizedColumnTypes argTypes);