如何从pipelinedb中的连续视图中流输出?

时间:2017-05-25 16:22:45

标签: stream real-time pipelinedb

我已经设置了pipelinedb,效果很好!我想知道在视图中的值更新后是否可以从连续视图中流式传输数据?也就是说,让一些外部过程对视图的更改起作用。

我希望将从视图生成的指标流式传输到仪表板中,我不想使用轮询数据库来实现此目的。

3 个答案:

答案 0 :(得分:3)

从0.9.5开始,已经删除了连续触发器,转而使用输出流和连续变换。 (由DidacticTactic首先提出)。连续视图的输出本质上是一个流,这意味着您可以基于它创建连续视图或变换。

简单示例:

  1. 首先创建一个流和连续视图。
  2. 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;
    
    1. 现在每个连续视图都有一个输出流。您可以使用output_of基于视图的输出创建变换。在转换中,您可以访问元组oldnew,它们分别代表旧值和新值。 (0.9.7有第三个叫delta)所以你可以创建一个使用' hourly_cv'的输出的变换。像这样:
    2. CREATE CONTINUOUS TRANSFORM hourly_ct AS
          SELECT
              (new).sum
          FROM output_of('hourly_cv')
          THEN EXECUTE PROCEDURE update();
      
      1. 在此示例中,我调用update,我们仍需要定义。它需要是一个返回触发器的函数。
      2. 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 streamscontinuous 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对象。