简介
pipelinedb是一个方便操作流式数据的postgresql的一个扩展,postgresql版本10之前是独立的数据库
(注意:pipelinedb扩展是基于pgsql数据库的,例如:你新建了一个数据库ifm,需要用命令行\c ifm 切换到ifm数据库 然后执行创建create extension pipelinedb;创建pipelinedb扩展时注意当前所在数据库再执行,删除扩展 drop extension pipelinedb)
pipelinedb运行原理
这里说一下个人的理解:
先说我们用这个pipelinedb是要做一件什么事,我们要多维度实时统计一个大数据集,传统方法是把数据存到表中,查表统计,这个过程太慢了,于是你就需要用到pipelinedb了,它省去了你把数据存入表中的这个步骤,通过一个类似管道的东西把数据交给内存来直接计算,只保存统计结果,过程非常快,我在项目中用到的是统计功能。
使用流程
- 首先创建一个流式数据的表(就是上面说的管道):例如官方例子
CREATE FOREIGN TABLE wiki_stream (
hour timestamp,
project text,
title text,
view_count bigint,
size bigint
)SERVER pipelinedb;
流式数据也是一行一行的数据,类似mysql一行一行的数据
注意:这个表可以理解为一个管道,通俗一点说就是这个表规定了你录入的数据和格式,没有别的意义,不能用sql语句直接select,为什么说是管道了 因为他的作用跟现实中的管道一样,官网上有这样一段话:
PipelineDB can dramatically reduce the amount of information that needs to be persisted to disk because only the output of continuous queries is stored. Raw data is discarded once it has been read by the continuous queries that need to read it.
大致意思就是pipelinedb可以大量减少存入数据库中的数据量,因为他只存储统计结果,一旦数据流被读取,被读取的数据流就会被丢弃,就是读一行丢一行。
- 数据已经通过管道输送给内存了,然后就是统计了,既然是统计就一定是有一个规则,不然给内存这么多数据它也不知道怎么统计,举个例子方便理解:
姓名 | 年龄 | 性别 |
---|---|---|
张三 | 18 | 男 |
李四 | 20 | 男 |
王五 | 18 | 女 |
赵六 | 21 | 男 |
上面这个表就是管道过来的数据,现在你可以统计了,但是需要一个规则,就是看我们的需求,是统计男的多少人,还是统计18岁的有多少人,只要你定义个规则,实现起来很简单;
pipelinedb也一样 你也要给它一个规则,这个规则就是我们需要创建的一个或多个视图。
看一下官方的例子:
CREATE VIEW wiki_stats WITH (action=materialize) AS
SELECT hour,
project,count(*) AS total_pages,
sum(view_count) AS total_views,
min(view_count) AS min_views,
max(view_count) AS max_views,
avg(view_count) AS avg_views,
percentile_cont(0.99) WITHIN GROUP (ORDER BY view_count) AS p99_views,
sum(size) AS total_bytes_served
FROM wiki_streamGROUP BY hour, project;
现在数据已经给内存了,统计规则也给内存了,内存就知道怎么做了,管道每过来一条数据,内存读取是否符合管道表的格式,如果符合就会按视图规则把统计结果累加,然后丢弃这条数据,然后继续获取数据,可以简单的理解成下图这样
我在项目中创建了一个管道表flowback_stream 和 多个视图,通过给''管道表''发送数据,视图中就生成了统计好的数据,再通过普通的sql语句来查询使用就可以了。