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