閱讀964 返回首頁    go 阿裏雲 go 技術社區[雲棲]


PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap庫)

標簽

PostgreSQL , varbit , varbitx , roaring bitmap , pilosa , bitmap , 12306 , 實時畫像 , 門禁廣告售票係統


背景

Pilosa is an open source, distributed bitmap index that dramatically accelerates queries across multiple, massive data sets.

Pilosa abstracts the index from data storage and optimizes it for massive scale.

pilosa 是什麼

https://www.pilosa.com/about/

pilosa 是一群開發人員為了解決一些科學計算相關的場景而設計的一個in memory bitmap數據管理軟件,可以加速一些特定的查詢。例如(哪個屬性是熱門屬性,某個屬性包含了哪些對象,哪些屬性通常會集體出現。)。

pilosa通常用在數據分析和統計領域,例如前麵提到的根據屬性組合求結果集,與阿裏雲RDS PostgreSQL varbitx提供的功能非常類似。

阿裏雲RDS PostgreSQL varbitx已用於多個業務場景:

《阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹》

《基於阿裏雲 RDS PostgreSQL 打造實時用戶畫像推薦係統》

《阿裏雲RDS for PostgreSQL varbitx插件門禁廣告銷售係統需求剖析和實踐》

pilosa 數據結構

https://www.pilosa.com/docs/data-model/

pilosa的結構為行列布爾邏輯值BIT矩陣,行和列的含義存儲在BoltDB的數據結構中。

pic

例如一張這樣的表

create table tbl (c1 int, c2 text, c3 numeric, c4 timestamp);
insert into tbl values (1,'abc',4.0, now());
insert into tbl values (1,'ab12c',1.0, now());

轉換為pilosa的結構,首先要對VALUE進行屬性化轉換,轉換過程就是建立k-v的過程。屬性即K-V。

例如,以上數據可以轉換為以下屬性。

c1:1  
  
c2:abc  
  
c2:ab12c  
  
c3:1.0-4.0  
  
c4:'2017-01-01 00:00:00'-now()  

屬性建立後,轉換為pilosa存儲結構

1 (c1:1) -> 11  
2 (c2:abc) -> 10  
3 (c2:ab12c) -> 01  
4 (c3:1.0-4.0) -> 11  
5 (c4:'2017-01-01 00:00:00'-now()) -> 11  

為了便於使用,pilosa還將數據結構進行了拆分。

1、索引(index),索引是指在對原始數據進行屬性化轉換後,得到的bitmap數據。

可以對原始數據建立多個不同的屬性轉化,例如c1:1, c2:abc,ab12c, c3:1, c3:4, ...是一種,前麵的例子又是另一種。不同的轉換規則,建立不同的索引。

不能跨索引查詢,隻能在一個索引內查詢。(因為跨索引的BITMAP可能沒法對上號)

2、幀(frame)

為了便於查詢,可以將一個索引,根據查詢目標的不同,劃分為多個幀。

例如ranked幀,按bitcount從大到小排列,便於查詢基於行的屬性TOPN。

pic

例如LRU幀,將最近訪問的行排在前麵,便於查詢活躍的行。

pic

3、時間窗口(Time Quantum)

可以設置index的時間窗口,設置時間窗口後,會根據數據的時間自動創建對應的時間視圖和對應的BITMAP VALUE。(if the time quantum is set to YMD, Range queries down to the granularity of a day are supported.)

pic

4、屬性(Attribute),前麵講了,屬性就是K-V,是為了得到bitmap,提前對原始數據所做的轉換。

5、分片(slice),為了提高計算速度,將單行切分為多個分片,例如一行有1024個BIT,切成兩個分片,分別對應512個BIT。

在計算時,每個分片是並行獨立計算,最後合並結果的。

6、視圖(View),視圖是pilosa內部,自動維護的一個對外可見的邏輯視野,默認會創建一個與數據寫入一致的標準視圖。(行,列與數據寫入時一致)

6.1、反轉(inverse)視圖bitmap,例如

SetBit(frame="A", rowID=8, columnID=3)  
SetBit(frame="A", rowID=11, columnID=3)  
SetBit(frame="A", rowID=19, columnID=5)  

反轉視圖和標準視圖如下

pic

6.2、時間窗口視圖(Time Quantums)

當用戶設置了索引的時間窗口屬性時,會自動生成對應的時間窗口視圖

SetBit(frame="A", rowID=8, columnID=3, timestamp="2017-05-18T00:00")  
SetBit(frame="A", rowID=8, columnID=3, timestamp="2017-05-19T00:00")  

pic

以上是pilosa的數據模型,有利於統計類的查詢。

pilosa 用戶案例

https://www.pilosa.com/use-cases/

化學相似性分析

交通數據分析

網絡流量分析

pilosa與傳統數據庫的關係

https://www.pilosa.com/docs/faq/

pilosa是一個用於加速統計類查詢的in memory索引數據結構,允許用戶自定義屬性,建立bitmap,時間窗口視圖等。同時內置了幀、切片等特性,加速查詢。

pilosa不是數據庫,也不能代替數據庫,把它當成分析類SQL的加速引擎是可以的。

用戶可以異步的方式,將數據導入pilosa,加速查詢。

pilosa支持GO,python,java客戶端驅動,或者調用pilosa API。

PostgreSQL 比特流類型

PostgreSQL 支持varbit類型,同時包含了一些bit的操作符,例如位移、與、或、異或、獲取位置BIT等。

阿裏雲RDS PostgreSQL varbitx

阿裏雲rds PostgreSQL varbitx是varbit類型的擴展包,支持更多的BIT操作,例如SET BIT,批量SET,按數組提供的位置SET,求BIT COUNT,求指定位置範圍的BIT COUNT,求特定數組提供的位置的BIT COUNT等。

詳細介紹如下

《阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹》

PG varbit 應用

例如實時數據分析(與pilosa類似),基於varbit的人物畫像,按標簽圈人。門禁廣告銷售係統等。

小結

pilosa是一套golang編寫的bitmap庫,通過PostgreSQL plgo應該可以將其嫁接到PostgreSQL中,作為一個插件庫來使用。

https://github.com/microo8/plgo

https://github.com/dbudworth/gopgfuncs

參考

https://github.com/zeromax007/gpdb-roaringbitmap

《阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹》

《PostgreSQL bitmapAnd, bitmapOr, bitmap index scan, bitmap heap scan》

《基於 阿裏雲 RDS PostgreSQL 打造實時用戶畫像推薦係統》

《PostgreSQL 與 12306 搶火車票的思考》

《門禁廣告銷售係統需求剖析 與 PostgreSQL數據庫實現》

https://www.pilosa.com/

《PostgreSQL 9.6 sharding based on FDW & pg_pathman》

最後更新:2017-06-13 02:32:05

  上一篇:go  PostgreSQL數據保留窗口功能的使用
  下一篇:go  高並發寫入存儲線性相關性優化