我已经设置了pipelinedb,效果很好!我想知道在视图中的值更新后是否可以从连续视图中流式传输数据?也就是说,让一些外部过程对视图的更改起作用。
我希望将从视图生成的指标流式传输到仪表板中,我不想使用轮询数据库来实现此目的。
答案 0 :(得分:3)
从0.9.5开始,已经删除了连续触发器,转而使用输出流和连续变换。 (由DidacticTactic首先提出)。连续视图的输出本质上是一个流,这意味着您可以基于它创建连续视图或变换。
简单示例:
CREATE STREAM s (
x int
);
CREATE CONTINUOUS VIEW hourly_cv AS
SELECT
hour(arrival_timestamp) AS ts,
SUM(x) AS sum
FROM s GROUP BY ts;
output_of
基于视图的输出创建变换。在转换中,您可以访问元组old
和new
,它们分别代表旧值和新值。 (0.9.7有第三个叫delta
)所以你可以创建一个使用' hourly_cv'的输出的变换。像这样:CREATE CONTINUOUS TRANSFORM hourly_ct AS
SELECT
(new).sum
FROM output_of('hourly_cv')
THEN EXECUTE PROCEDURE update();
update
,我们仍需要定义。它需要是一个返回触发器的函数。CREATE OR REPLACE FUNCTION update()
RETURNS trigger AS
$$
BEGIN
// Do anything you want here.
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
我发现0.9.5 release notes blog post有助于理解输出流以及为什么不再有连续触发器。
答案 1 :(得分:2)
请查看我们在output streams和continuous transforms上的技术文档中的相关部分,以获取有关如何执行此操作的帮助,如果您需要帮助,请随时在我们的Gitter channel中ping我们你可以在文档中找到。
答案 2 :(得分:1)
我觉得有点像一个白痴试图找出这个问题的答案可能就像使用Didactic提供的工具一样。也许我是盲人,但我还没找到办法。我找到了包含连续触发器的数据库的9.3版本,但此后已被删除,我不希望切换到旧版本的数据库。
这有点令人伤心,但我想它已被移出项目的开源版本,以适应同一公司提供的实时分析仪表板项目。
无论哪种方式。我通过使用存储过程解决了这个问题。与内置函数提供的内容相比,它可能效率稍低,但我每分钟都会在数据库上运行几千次,而我的虚拟机CPU和RAM只是打扰了我。
CREATE OR REPLACE FUNCTION all_insert(text,text)
RETURNS void AS
$BODY$
DECLARE
result text;
BEGIN
INSERT INTO all_in (streamid, generalinput) values($1, $2);
SELECT array_to_json(array_agg(json_build_object('streamId', streamid, 'total', count)))::text into result from totals;
PERFORM pg_notify('totals', result);
END
$BODY$
LANGUAGE plpgsql;
所以我的插入和通知是通过查询这个单个存储过程完成的。然后我的应用程序只需要监听PSQL db notify事件并适当地处理它们。在上面的示例中,应用程序将接收具有特定流ID和与其关联的总数的JSON对象。