流关联

流视图 的并非只靠select 流(foreign table) 产生,也可以通过将输入的时序数据和静态的PipelineDB数据表组合后得到,这可以用称作流-表关联的方式实现。

流-表关联

流-表关联在 event到达时 将其与表中匹配的行数据组合。换言之,如果在表数据在 event 被读取后才被插入,即使是匹配的,也不会对流视图产生影响。新数据只会在 event被读取时 产生。即使流-表关联中的表被清空了,流视图中的数据也不会变化。

支持的关联类型

流只支持 JOIN 类型,CROSS JOINFULL JOIN 支持的,LEFT JOINRIGHT JOIN 只有在 JOIN 中的不匹配数据在流这边(即流在left join的右边或right join的左边)时才支持。ANTI JOINSEMI JOIN 需要在关联的条件列上创建索引。

示例

计算id在whitelist中的event数

CREATE VIEW count_whitelisted AS SELECT COUNT(*) FROM
 stream JOIN whitelist ON stream.id = whitelist.id;

计算流中的id在users中每个full_name下的命中数

CREATE VIEW augmented AS SELECT user_data.full_name, COUNT(*)
 FROM stream JOIN user_data on stream.id::integer = user_data.id
GROUP BY user_data.full_name;

Spatially将流中的坐标关联到最近的城市中,并计算每个城市命中的坐标数

CREATE VIEW spatial AS SELECT cities.name, COUNT(*) FROM
geo_stream, cities WHERE st_within(geo_stream.coords::geometry, cities.borders)
GROUP BY cities.name;

注解

您可以已经推测到,流-表关联中的表如果很大的话,产生的性能开销会极大。为了达到最高的性能,关联中的表应该是比较小的,小到内存足以承受,同时建议您在关联的列上创建索引。

流-流关联

目前不支持流之间的关联,这个功能可能会出现在将来的版本中。

注解

译者注: 2019年5月1日,PipelineDB公司宣布加入Confluent(Kafka的公司),官方版将会停留在1.0.0,详情见 官方报道