Postgresql - PipelineDB - Stream

 

Stream 是允许客户机通过Continuous Views推送时间序列数据的抽象。stream row,或者简单的事件,看起来完全像普通的表行,并且用于将数据写入流的接口与用于将数据写入表的接口相同。然而,stream 的语义与表基本上不同。

也就是说,事件仅在 stream 中“存在”,直到它们被从该 stream 读取的所有Continuous Views消费为止。即使如此,用户仍然不可能从 streams 中选择。Streams 专用于连续视图的输入。

streams 在PipelineDB中表示为由管道数据库外部服务器管理的外部表。创建外部表的语法类似于创建常规PostgreSQL表的语法:

 

CREATE FOREIGN TABLE stream_name ( [ { column_name data_type [ COLLATE collation ] } [, ... ] ] ) SERVER pipelinedb;

 

可以向 stream 中增加列,但不能删除列

 

 

Writing To Streams

Insert:

通过PG中常规的insert语句,写入到stream。

 

Prepared INSERT: Stream inserts 与 prepared inserts一起工作,以便减少网络开销:

PREPARE write_to_stream AS INSERT INTO stream (x, y, z) VALUES ($1, $2, $3); EXECUTE write_to_stream(0, 1, 2); EXECUTE write_to_stream(3, 4, 5); EXECUTE write_to_stream(6, 7, 8);

 

COPY

COPY stream (data) FROM '/some/file.csv'

 

============================================================

Output Streams

输出 streams 使得从对任何连续视图或由连续转换选择的行的增量更改流中读取数据成为可能。输出 streams 是常规PipelineDB streams ,因此可以由其他连续视图或转换读取。它们通过连续视图或转换上调用的output_of函数进行访问。

对于continuous views,输出 Streams 中的每一行总是包含一个新旧元组,表示对底层 continuous views 所做的更改。如果更改对应于 continuous views 插入,则旧元组将为NULL。如果更改与删除相对应(当前仅当滑动窗口元组超出窗口时才可能这样做),则新元组为NULL。

CREATE VIEW v_sum AS SELECT sum(x) FROM stream;

CREATE VIEW v_deltas AS SELECT abs((new).sum - (old).sum) AS delta FROM output_of('v_sum') WHERE abs((new).sum - (old).sum) > 10;

mytest=# INSERT INTO stream (x) VALUES (11);

INSERT 0 1

mytest=# select * from v_sum;

sum

-----

23

(1 row)

 

mytest=# select * from v_deltas;

delta

-------

11

(1 row)

 

mytest=# INSERT INTO stream (x) VALUES (5);

INSERT 0 1

mytest=# select * from v_deltas;

delta

-------

11

(1 row)

mytest=# INSERT INTO stream (x) VALUES (21);

INSERT 0 1

mytest=# select * from v_deltas;

delta

-------

11

21

(2 rows)

 

Output Streams on Sliding Windows

对于非sliding-window 的 continuous views,只要对 stream 的写入对 continuous view 的结果产生更改,就简单地将输出流写入。然而,由于 sliding-window continuous views 的结果也依赖于时间,因此它们的输出流会随着时间的变化而自动写入。也就是说,sliding-window continuo us views的输出流将接收写入,即使它们的输入流没有被写入。

 

 

============================================================

Delta Streams

除了写入 continuous views 的输出流的新旧元组之外,还针对对continuous views 进行的每个增量更改发出增量元组。delta元组包含表示新旧元组之间的“差异”的值。对于诸如sum之类的小聚合,旧值和新值之间的增量只是标量值(new).sum - (old).sum,,就像在上面的示例中手动做的那样。

 

如所见,v_real_deltas记录每次插入导致的增量更改。但sum是相对乏味的。delta流的真正神奇之处在于它们适用于所有聚合,甚至可以与Combine结合使用,以有效地聚合不同粒度/分组的连续视图输出。

 

mytest=# CREATE VIEW v_sum_x_y AS SELECT sum(x + y) FROM stream;

CREATE VIEW

mytest=# insert into stream (x,y) values (1,2);

INSERT 0 1

mytest=# CREATE VIEW v_real_deltas AS SELECT (delta).sum FROM output_of('v_sum_x_y');

CREATE VIEW

mytest=# insert into stream (x,y) values (1,2);

INSERT 0 1

mytest=# select * from v_real_deltas;

sum

-----

3

(1 row)

 

mytest=# insert into stream (x,y) values (2,3);

INSERT 0 1

mytest=# select * from v_real_deltas;

sum

-----

3

5

(2 rows)

 

mytest=# insert into stream (x,y) values (3,5);

INSERT 0 1

mytest=# select * from v_real_deltas;

sum

-----

3

5

8

(3 rows)

 

 

============================================================

pipelinedb.stream_targets

 

有时,在写入stream 时,例如,在将历史数据重放到新创建的连续视图中时,可能只希望更新一组选定的continuous view(视图和转换)。可以使用.db.stream_targets配置参数指定应该从当前会话读取写入流的事件的连续查询。将.db.stream_targets设置为希望使用事件的连续查询的逗号分隔列表:

 

mytest=# CREATE VIEW v0 AS SELECT COUNT(*) FROM stream;

CREATE VIEW

mytest=#

mytest=# CREATE VIEW v1 AS SELECT COUNT(*) FROM stream;

CREATE VIEW

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# SET pipelinedb.stream_targets TO v0;

SET

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# select * from v0;

count

-------

3

(1 row)

 

mytest=# select * from v1;

count

-------

1

(1 row)

mytest=# SET pipelinedb.stream_targets TO default;

SET

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# INSERT INTO stream (x) VALUES (1);

INSERT 0 1

mytest=# select * from v0;

count

-------

6

(1 row)

 

mytest=# select * from v1;

count

-------

4

(1 row)

 

 

============================================================

Arrival Ordering

PipelineDB 使用的事件排序为,这意味着,事件到达PipelineDB服务器时具有时间戳,并被赋予包含该时间戳的名为arrival_timestamp的附加属性。然后,arrival_timestamp可以在带有时间组件的Continuous Views中使用,比如Sliding Windo

 

============================================================

Event Expiration

当每个事件到达PipelineDB服务器后,它就会得到一个小位图,表示仍然需要读取事件的所有ContinuousView。当一个连续视图读完一个事件后,它会在位图中翻转一个位。当位图中的所有位都设置为1时,事件被丢弃,并且永远不能再次访问。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值