PipelineDB流式计算(四)- 连续转换

连续转换

连续转换用于传入的无需存储的时间顺序数据,由于没有存储数据,因此连续转换不支持聚合。转换的结果可以通过管道传输到另一个流或写入到外部存储单元。

创建连续转换

转换被定义为带有转换动作参数集的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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值