流資料庫概率計算概念-PipelineDB-ProbabilisticDataStructures&Algorithms
標籤
PostgreSQL , PPAS , enterprisedb , spin , 鎖等待優化
背景
原文:
https://mp.weixin.qq.com/s/yDSnk4BzKKu1IuhMRgL7_w
作者: 桑櫟
PipelineDB在物理儲存的時候,使用了大量的聚合資料型別,在處理持續資料的時候,這些型別起到很重要的左右,我們來了解一下PipelineDB是如何使用這些資料型別的。
官方地址:http://docs.pipelinedb.com/probabilistic.html
PipelineDB目前提供的資料型別為:
-
Bloom Filter
-
Count-Min Sketch
-
Filtered-Space Saving Top-K
-
HyperLogLog
-
T-Digest
官方地址:
http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-types
http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-functions
對應的資料型別和function。這些資料型別,如果你不想在CV中使用,其實也可以在普通表內使用。
具體的程式碼實現在:src/backend/utils/adt/
Bloom Filter
在PipelineDB中,Bloom的實現:src/backend/pipeline/bloom.c
Bloom這個型別幾乎使用的太頻繁了,PipelineDB內建這個資料型別,我們在CV中可以很好是用bloom來儲存資料
例子:
在建立CV的時候,欄位直接能用內建的UDF來生成bloom的型別
插入測試資料:
還有很多udf在http://docs.pipelinedb.com/aggregates.html#bloom-filter-aggregates
HyperLogLog
在PipelineDB中,HLL的實現:src/backend/pipeline/hll.c
在大部分的實際運用中,HLL是用來解決count(distinct)問題的。在pp中,也是用來儲存這種資料的。
例子:
建立的v_hll,對應的欄位count(distinct)物理儲存格式就是HLL.而在查詢過程中,parse會把這個欄位解析成一個函式:
hll_count_distinct_final
我們看看執行計劃
例子:
我不管插入幾次,結果就是count(distinct)
在0.9.7之前,這個效率其實很一般,scan會特別消耗效能,在0.9.7對該功能進行了提升
https://www.pipelinedb.com/blog/pipelinedb-0-9-7-delta-streams-and-towards-a-postgresql-extension
Count-Min Sketch
在PipelineDB中,cmsketch的實現:
src/backend/pipeline/cmsketch.c
cmsketch主要是解決大流量中元素出現的頻率,跟bloom filter其實還蠻類似,不過bloom是記錄存在與否。使用cmsketch是有誤差的。
例子:
插入測試資料:
官方說明:http://docs.pipelinedb.com/aggregates.html#count-min-sketch-aggregates
Filtered-Space Saving Top-K (FSS)
PipelineDB中FSS的具體實現:src/backend/pipeline/fss.c
FSS在具體的使用是計算Top-K,官方的具體實現是根據論文:
http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/dict.refd.pdf
有興趣的同學可以看看。
在實際環境中,例如計算最近5分鐘的top-10,並且非常的節省空間和記憶體,我們來看看pp是如何使用的。
例子:
插入測試資料:
插入6條資料
查詢v_fss
通過fss_topk只查詢出5條,每個都顯示value為1
插入的6不見了
fss_topk_values輸出每個value
fss_topk_freqs是每個element的個數
再插入一條:
5是2條資料。
插入6
6出現了,並且替換掉了4.
官方說明:http://docs.pipelinedb.com/builtin.html#filtered-space-saving-functions
T-Digest
PipelineDB中tdigest的實現:src/backend/pipeline/tdigest.c
tdigest主要是根據百分位數和中位數來進行估計計算。感覺跟資料庫中內建函式percentile_cont有點像。這個功能沒怎麼用過
具體可以看看https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf
我簡單的介紹一下如何在PipelineDB中的使用吧。
例子:
插入資料:
0.5取的中位數2
0.6是2.3
大概就是這樣的情況,官方說明:
http://docs.pipelinedb.com/builtin.html#t-digest-functions
over,差不多介紹了個簡單的使用吧,裡面的SQL如果想實驗可以來github拿一下
https://github.com/sangli00/WeCharOfficialAccounts/blob/master/PipelineDB內建函式介紹.sql
相關文章
- 資料庫概念資料庫
- 資料庫的概念資料庫
- Flink流計算中SQL表的概念和原理SQL
- 資料庫概論 (一)資料庫概念資料庫
- Oracle資料庫-----資料庫的基本概念Oracle資料庫
- NoSQL資料庫概念與NoSQL資料庫家族SQL資料庫
- oracle資料庫SCN概念Oracle資料庫
- 快速部署DBus體驗實時資料流計算
- 微軟“可信計算”概念提出10週年–資料資訊圖微軟
- 請問,平行計算和資料庫資料庫
- php資料流中第K大元素的計算方法PHP
- Golang框架實戰-KisFlow流式計算框架(4)-資料流Golang框架
- 機器學習之邏輯迴歸:計算概率機器學習邏輯迴歸
- 概率計算(抽獎活動、命中率)
- 資料庫基礎概念理解資料庫
- 資料庫概念、原理、理論資料庫
- 大資料開發實戰:實時資料平臺和流計算大資料
- Apache Flink,流計算?不僅僅是流計算!Apache
- 資料庫設計---PowerDesigner(物理模型和概念模型)資料庫模型
- 資料庫設計——三正規化概念+現實資料庫
- 陽振坤:資料庫天然選擇了計算機,但計算機天然並不適合資料庫資料庫計算機
- 超越批處理的世界:流計算101(現代資料處理概念的高層次概覽)
- 大資料之概率論大資料
- 一類骰子游戲中的概率計算
- Redis多個資料庫的概念Redis資料庫
- SQLSERVER學習1——資料庫概念SQLServer資料庫
- 「Oracle」Oracle資料庫基本概念Oracle資料庫
- 「Oracle」Oracle 資料庫基本概念Oracle資料庫
- Oracle資料庫開發——表(概念)Oracle資料庫
- 大資料計算生態之資料計算(二)大資料
- 大資料計算生態之資料計算(一)大資料
- Prometheus時序資料庫-報警的計算Prometheus資料庫
- 亞信安慧AntDB資料庫與流式計算資料庫
- 剖析雲端計算中的“共享型資料庫”資料庫
- 拜託,在資料庫中執行計算資料庫
- [索引]Oracle RAC資料庫平行計算的使用索引Oracle資料庫
- 資料庫(01)基本概念丨MySQL資料庫MySql
- 為什麼DBA需要資料庫廠商的資料庫概念文件資料庫