之前有写过 初识PipelineDB,里面做了一个小实验,来学习PipelineDB,现在我们通过官方文档,看看PipelineDB的原理。
PipelineDB 最根本的概念叫做 continuous view (连续视图)。continuous view 非常类似于常规视图,只是它从流与表的组合中选择作为其输入,并在新数据写入这些输入时实时递增地更新。
一旦 stream row 已被必须读取它的连续视图读取,就丢弃它。原始的、颗粒状的数据不会存储在任何地方。对于 continuous view ,唯一持久化的数据是通过运行 SELECT * FROM that_view 返回的任何数据。因此,可以将连续视图看作一个高吞吐量、实时的物化视图。
==============================================
Creating Continuous Views
Continuous views是被定义为PostgresSQL views,action设置为materialize。
CREATE VIEW name [WITH (action=materialize [, ...])] AS query
默认action是materialize,因此可以提交用于创建 continuous views。只要从stream中选择一个,PipelineDB就会使用 materialize 解释CREATE VIEW语句。
SELECT [ DISTINCT [ ON ( expression [, ...] ) ] ] expression [ [ AS ] output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] where from_item can be one of: stream_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ] from_item [ NATURAL ] join_type from_item [ ON join_condition ]
Stream 类似于表,并且是从它们的FROM子句中读取的continuous views and transforms read 。
expression: PostgreSQL表达式或分组设置规范。
output_name: 一个可选的标识符来命名表达式。
condition: 任何类型为布尔类型结果的表达式。任何不满足此条件的行都将从输出中删除。当实际行值被替换为任何变量引用时,如果行返回true,则该行满足条件。
==============================================
Dropping Continuous Views
mytest=# drop view v0 ;
==============================================
Truncating Continuous Views
mytest=# select * from v1;
count
-------
4
(1 row)
mytest=# SELECT pipelinedb.truncate_continuous_view('v1');
truncate_continuous_view
--------------------------
(1 row)
mytest=# select * from v1;
count
-------
(0 rows)
==============================================
Viewing Continuous Views
mytest=# SELECT * from pipelinedb.views;
==============================================
Data Retrieval
mytest=# SELECT * FROM v_sum;
sum
-----
60
(1 row)
==============================================
Time-to-Live (TTL) Expiration
CREATE VIEW v_ttl WITH (ttl = '1 month', ttl_column = 'minute') AS SELECT minute(arrival_timestamp), COUNT(*) FROM some_stream GROUP BY minute;
==============================================
Modifying TTLs
TTL可以通过pipelinedb.set_ttll函数从连续视图中添加、修改和删除:
select pipelinedb.set_ttl ( cv_name, ttl, ttl_column )
用给定参数更新给定的连续视图的TTL。ttl是表示为字符串(例如“1天”)的间隔,ttl_column是基于时间戳的列的名称。
==============================================
Activation and Deactivation
因为 continuous views 是连续处理输入流的,所以在不必完全关闭PipelineDB的情况下启动和停止该处理是有用的。例如,如果连续视图导致意外的系统负载量或开始抛出错误,则暂时停止对该视图(或所有视图)的连续处理直到问题得到解决可能是有用的。
这个级别的控制是由激活和停用函数提供的,它相当于是 “play” 和 “pause”。
当连续视图处于活动状态时,它们会主动地从输入流中读取数据,并相应地递增地更新结果。相反,不活动的连续视图不从它们的输入流读取,也不更新它们的结果。当连续视图处于非活动状态,并且continuous views 本身仍然可读时,PipelineDB保持功能——它们只是没有更新。