FilterFactory 类
如果编写过滤器,您还必须编写用于生成过滤器实例的过滤器工厂。为此,请对 FilterFactory
类设置子类。
子类将执行函数执行的初始验证和规划工作,并将每个主机(将进行数据过滤)上的 UDFilter
对象实例化。
过滤器工厂是单例。您的子类必须为无状态子类,没有包含数据的字段。该子类还不得修改任何全局变量。
FilterFactory 方法
FilterFactory
类定义了以下方法。您的子类必须覆盖 prepare()
方法。可以覆盖其他方法。
设置
Vertica 将在启动程序节点上调用 plan()
一次,以执行下列任务:
-
检查已从 COPY 语句中的函数调用传递的任何参数和错误消息(如果出现任何问题)。您通过从传递至
plan()
方法的ServerInterface
的实例中获得ParamReader
对象读取参数。 -
存储各个主机所需的任何信息,以便过滤作为参数传递的
PlanContext
实例中的数据。例如,您可以存储过滤器将读取的输入格式的详细信息,并输出该过滤器应生成的格式。plan()
方法仅在启动程序节点上运行,而prepare()
方法则在每个读取数据源的主机上运行。因此,该对象是它们之间的唯一通信方式。您通过从
getWriter()
方法中获取ParamWriter
对象在PlanContext
中存储数据。然后,通过对ParamWriter
调用方法(比如setString
)写入参数。注意
ParamWriter
仅提供存储简单数据类型的能力。对于复杂的类型,您需要以某种方式对数据进行序列化并将其作为字符串或长字符串存储。
创建筛选器
Vertica 将调用 prepare()
,以创建并初始化筛选器。它在将执行过滤的每个节点上调用此方法一次。Vertica 根据可用资源自动选择可完成该工作的最佳节点。您无法指定在哪些节点上完成工作。
定义参数
实施 getParameterTypes()
可定义过滤器所使用的参数的名称和类型。Vertica 使用此信息对调用人员发出有关未知或缺失参数的警告。Vertica 会忽略未知参数并为缺失参数使用默认值。当您需要为函数定义类型和参数时,您不需要覆盖此方法。
API
FilterFactory API 提供了以下通过子类扩展的方法:
virtual void plan(ServerInterface &srvInterface, PlanContext &planCtxt);
virtual UDFilter * prepare(ServerInterface &srvInterface, PlanContext &planCtxt)=0;
virtual void getParameterType(ServerInterface &srvInterface, SizedColumnTypes ¶meterTypes);
创建 FilterFactory
之后,您必须将其注册到 RegisterFactory
宏。
FilterFactory API 提供了以下通过子类扩展的方法:
public void plan(ServerInterface srvInterface, PlanContext planCtxt)
throws UdfException;
public abstract UDFilter prepare(ServerInterface srvInterface, PlanContext planCtxt)
throws UdfException;
public void getParameterType(ServerInterface srvInterface, SizedColumnTypes parameterTypes);
FilterFactory API 提供了以下通过子类扩展的方法:
class PyFilterFactory(vertica_sdk.SourceFactory):
def __init__(self):
pass
def plan(self):
pass
def prepare(self, planContext):
#User implement the function to create PyUDSources.
pass