簡介
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語句來查詢使用就可以了。
