流处理
在Vastbase G100流计算中,基于流的Foreign table扮演了生产者角色,而流视图(Continuous view)和流转换(Transform)扮演了消费者角色。它们的处理逻辑如下图所示。
其中,CV即流视图(Continuous view),UDF为自定义函数(User Definition Function),pipeline_stream_insert为系统提供的内置触发器函数,当前内置的触发器函数 pipelinedb.insert_into_stream。
(1)流(Stream)
流是一种允许客户端将时序数据写入流视图(Continuous view,CV)的抽象管道。流里面的一行数据(或者简单称作event),与数据表中的行数据是很相似的,并且二者的写入也是完全一致的。然而,流和数据表的语义是完全不同的。换言之,event只会在被所有的流视图消费完之前”存在”于流中。即使这样,用户仍然不能直接从流中查询数据。流唯一的作用就是充当流视图的输入。流的语法如下:
CREATE FOREIGN TABLE stream_name ( [
{ column_name data_type [ COLLATE collation ] } [, … ]
] )
SERVER pipelinedb;
流数据可以通过insert、copy或者预处理(prepare)的方式来进行写入,通过流视图或流转换后输出。
(2)流视图(Continuous view)
流视图(Continuous view,CV)和Vastbase G100中普通视图非常相似,不同的是在创建流视图时加关键字materialize,语法如下:
CREATE VIEW name [WITH (action=materialize [, …])] AS query
流视图不存储数据,而是将数据存储到了一张以流视图名为前缀,以mrel为后缀的表中,即CV_mrel。流视图将流和表中的数据组合后作为输入并进行实时增量更新。流数据(foreign table)一旦被流视图读取后就会被销毁,流数据不会存储在任何地方。只有诸如SELECT * FROM that_view查询返回的结果才会被持久化,从这点看,流视图可以被视为高吞吐量、实时的物化视图。
流视图是实时增量更新的,可以在更新流视图结果集时考虑当前时间。在流视图WHERE子句中包含与当前时间相关信息的查询被称作滑动窗口(sliding-window)查询。滑动的WHERE子句过滤或接收到的event集合是随时间持续变化的。
流视图中过期数据可以通过指定一个时间类型列并且设置存活时间(TTL)来清理。
(3)流转换(Transform)
流转换(Transform)可以在不存储时序的情况下对其进行实时转换。由于不存储数据,所以流转换不支持聚合操作。转换后的数据既可以作为另一个流的输入,也可以写入到外部数据存储中。流转换通过将action赋值为transform来声明,语法如下:
CREATE VIEW name (WITH action=transform [,outputfunc=function_name(arguments)])AS query
其中function_name是一个用户传入的函数,它的返回类型为trigger,并且会作用到流转换的每一行输出上。由于可以自定义处理函数,因此,流转换具备极大的灵活性,可以将流数据传输到任何想要传输的地方。