连续转换
连续转换用于传入的无需存储的时间顺序数据,由于没有存储数据,因此连续转换不支持聚合。转换的结果可以通过管道传输到另一个流或写入到外部存储单元。
创建连续转换
转换被定义为带有转换动作参数集的PostgreSQL视图。下面是创建连续转换的语法:
CREATE VIEW name (WITH action=transform [, outputfunc=function_name( arguments ) ]) AS query;
query是一个PostgreSQL选择语句的子集:
SELECT expression [ [ AS ] output_name ] [, ...]
[ FROM from_item [, ...] ]
[ WHERE condition ]
[ GROUP BY expression [, ...] ]
其中,SELECT语句中的表达式不能包含聚合,from_item可以是以下内容:
stream_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
from_item [ NATURAL ] join_type from_item [ ON join_condition ]
function_name:可选的用户自定义函数,且返回类型为触发器,PipelineDB会对连续转换输出的每一行执行该函数。
arguments:在执行触发器时提供给函数的可选的、由逗号分隔的参数列表,且参数只能是字符串常量。
连续转换相当于是传入流数据上的触发器,对输出的每个新数据行执行触发器函数,类似作为每个行触发器的AFTER INSERT执行,因此没有旧行。
删除连续转换
要从系统中删除连续转换,使用DROP VIEW命令:
DROP VIEW continuous_transform;
这将从系统中删除连续转换及其所有相关资源。
查看连续转换
要查看系统中当前的连续转换及其定义,可以运行以下查询:
SELECT * FROM pipelinedb.transforms;
输出流
所有连续转换都有与之相关联的输出流,可以很容易的被其他转换或视图读取。同样的,连续转换的输出流只包含转换选择的行。
下方是一个简单的转换,它将传入的行与表关联起来:
CREATE VIEW t WITH (action=transform) AS
SELECT t.y FROM some_stream s JOIN some_table t ON s.x = t.x;
上述转换,将关联表中的值写到它的输出流中,允许其他视图使用output_of读取输出流:
CREATE VIEW v WITH (action=materialize) AS
SELECT sum(y) FROM output_of('t');
内置变换输出函数
为了在连续转换的输出上提供比其内置输出流更大的灵活性,PipelineDB公开了一个接口,使用触发器函数接收转换的行。附加到转换的触发器函数可以对接收到的行执行任何操作,包括写入到其他流。
目前,PipelineDB只提供了一个可用于连续转换的内置触发器函数,insert_into_stream,它将连续转换的输出插入到指定的流中。
CREATE VIEW t WITH (action=transform, outputfunc=pipelinedb.insert_into_stream('even_stream)) AS
SELECT x, y FROM stream WHERE mod(x, 2) = 0;
上述连续变换将(x, y)中x是偶数的所有值插入到even_stream中。
创建自定义输出函数
假设我们需要要将输出插入到一张关系表中,可以通过类似以下SQL语句实现:
CREATE TABLE t (user text, value int);
CREATE OR REPLACE FUNCTION insert_into_t()
RETURNS trigger AS
$$
BEGIN
INSERT INTO t (user, value) VALUES (NEW.user, NEW.value);
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE VIEW ct WITH (action=transform, outputfunc=insert_into_t) AS
SELECT user::text, value::int FROM stream WHERE value > 100;