流关联¶
流视图 的并非只靠select 流(foreign table) 产生,也可以通过将输入的时序数据和静态的PipelineDB数据表组合后得到,这可以用称作流-表关联的方式实现。
流-表关联¶
流-表关联在 event到达时 将其与表中匹配的行数据组合。换言之,如果在表数据在 event 被读取后才被插入,即使是匹配的,也不会对流视图产生影响。新数据只会在 event被读取时 产生。即使流-表关联中的表被清空了,流视图中的数据也不会变化。
支持的关联类型¶
流只支持 JOIN
类型,CROSS JOIN
和 FULL JOIN
是 不 支持的,LEFT JOIN
和 RIGHT JOIN
只有在 JOIN
中的不匹配数据在流这边(即流在left join的右边或right join的左边)时才支持。ANTI JOIN
和 SEMI 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;
注解
您可以已经推测到,流-表关联中的表如果很大的话,产生的性能开销会极大。为了达到最高的性能,关联中的表应该是比较小的,小到内存足以承受,同时建议您在关联的列上创建索引。