Skip to content

Commit c605d3e

Browse files
committed
new doc
1 parent f823862 commit c605d3e

File tree

8 files changed

+190
-0
lines changed

8 files changed

+190
-0
lines changed

201706/20170612_01.md

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
## PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap库)
2+
3+
### 作者
4+
digoal
5+
6+
### 日期
7+
2017-06-12
8+
9+
### 标签
10+
PostgreSQL , varbit , varbitx , roaring bitmap , pilosa , bitmap , 12306 , 实时画像 , 门禁广告售票系统
11+
12+
----
13+
14+
## 背景
15+
Pilosa is an open source, distributed bitmap index that dramatically accelerates queries across multiple, massive data sets.
16+
17+
Pilosa abstracts the index from data storage and optimizes it for massive scale.
18+
19+
## pilosa 是什么
20+
https://www.pilosa.com/about/
21+
22+
pilosa 是一群开发人员为了解决一些科学计算相关的场景而设计的一个in memory bitmap数据管理软件,可以加速一些特定的查询。例如(哪个属性是热门属性,某个属性包含了哪些对象,哪些属性通常会集体出现。)。
23+
24+
pilosa通常用在数据分析和统计领域,例如前面提到的根据属性组合求结果集,与阿里云RDS PostgreSQL varbitx提供的功能非常类似。
25+
26+
阿里云RDS PostgreSQL varbitx已用于多个业务场景:
27+
28+
[《阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍》](../201705/20170502_01.md)
29+
30+
[《基于阿里云 RDS PostgreSQL 打造实时用户画像推荐系统》](../201610/20161021_01.md)
31+
32+
[《阿里云RDS for PostgreSQL varbitx插件门禁广告销售系统需求剖析和实践》](../201611/20161124_01.md)
33+
34+
## pilosa 数据结构
35+
https://www.pilosa.com/docs/data-model/
36+
37+
pilosa的结构为行列布尔逻辑值BIT矩阵,行和列的含义存储在BoltDB的数据结构中。
38+
39+
![pic](20170612_01_pic_001.jpg)
40+
41+
例如一张这样的表
42+
43+
create table tbl (c1 int, c2 text, c3 numeric, c4 timestamp);
44+
insert into tbl values (1,'abc',4.0, now());
45+
insert into tbl values (1,'ab12c',1.0, now());
46+
47+
转换为pilosa的结构,首先要对VALUE进行属性化转换,转换过程就是建立k-v的过程。属性即K-V。
48+
49+
例如,以上数据可以转换为以下属性。
50+
51+
```
52+
c1:1
53+
54+
c2:abc
55+
56+
c2:ab12c
57+
58+
c3:1.0-4.0
59+
60+
c4:'2017-01-01 00:00:00'-now()
61+
```
62+
63+
属性建立后,转换为pilosa存储结构
64+
65+
```
66+
1 (c1:1) -> 11
67+
2 (c2:abc) -> 10
68+
3 (c2:ab12c) -> 01
69+
4 (c3:1.0-4.0) -> 11
70+
5 (c4:'2017-01-01 00:00:00'-now()) -> 11
71+
```
72+
73+
为了便于使用,pilosa还将数据结构进行了拆分。
74+
75+
1、索引(index),索引是指在对原始数据进行属性化转换后,得到的bitmap数据。
76+
77+
可以对原始数据建立多个不同的属性转化,例如c1:1, c2:abc,ab12c, c3:1, c3:4, ...是一种,前面的例子又是另一种。不同的转换规则,建立不同的索引。
78+
79+
不能跨索引查询,只能在一个索引内查询。(因为跨索引的BITMAP可能没法对上号)
80+
81+
2、帧(frame)
82+
83+
为了便于查询,可以将一个索引,根据查询目标的不同,划分为多个帧。
84+
85+
例如ranked帧,按bitcount从大到小排列,便于查询基于行的属性TOPN。
86+
87+
![pic](20170612_01_pic_002.jpg)
88+
89+
例如LRU帧,将最近访问的行排在前面,便于查询活跃的行。
90+
91+
![pic](20170612_01_pic_003.jpg)
92+
93+
3、时间窗口(Time Quantum)
94+
95+
可以设置index的时间窗口,设置时间窗口后,会根据数据的时间自动创建对应的时间视图和对应的BITMAP VALUE。(if the time quantum is set to YMD, Range queries down to the granularity of a day are supported.)
96+
97+
![pic](20170612_01_pic_005.jpg)
98+
99+
4、属性(Attribute),前面讲了,属性就是K-V,是为了得到bitmap,提前对原始数据所做的转换。
100+
101+
5、分片(slice),为了提高计算速度,将单行切分为多个分片,例如一行有1024个BIT,切成两个分片,分别对应512个BIT。
102+
103+
在计算时,每个分片是并行独立计算,最后合并结果的。
104+
105+
6、视图(View),视图是pilosa内部,自动维护的一个对外可见的逻辑视野,默认会创建一个与数据写入一致的标准视图。(行,列与数据写入时一致)
106+
107+
6\.1、反转(inverse)视图bitmap,例如
108+
109+
```
110+
SetBit(frame="A", rowID=8, columnID=3)
111+
SetBit(frame="A", rowID=11, columnID=3)
112+
SetBit(frame="A", rowID=19, columnID=5)
113+
```
114+
115+
反转视图和标准视图如下
116+
117+
![pic](20170612_01_pic_004.jpg)
118+
119+
6\.2、时间窗口视图(Time Quantums)
120+
121+
当用户设置了索引的时间窗口属性时,会自动生成对应的时间窗口视图
122+
123+
```
124+
SetBit(frame="A", rowID=8, columnID=3, timestamp="2017-05-18T00:00")
125+
SetBit(frame="A", rowID=8, columnID=3, timestamp="2017-05-19T00:00")
126+
```
127+
128+
![pic](20170612_01_pic_005.jpg)
129+
130+
以上是pilosa的数据模型,有利于统计类的查询。
131+
132+
## pilosa 用户案例
133+
https://www.pilosa.com/use-cases/
134+
135+
化学相似性分析
136+
137+
交通数据分析
138+
139+
网络流量分析
140+
141+
## pilosa与传统数据库的关系
142+
https://www.pilosa.com/docs/faq/
143+
144+
pilosa是一个用于加速统计类查询的in memory索引数据结构,允许用户自定义属性,建立bitmap,时间窗口视图等。同时内置了帧、切片等特性,加速查询。
145+
146+
pilosa不是数据库,也不能代替数据库,把它当成分析类SQL的加速引擎是可以的。
147+
148+
用户可以异步的方式,将数据导入pilosa,加速查询。
149+
150+
pilosa支持GO,python,java客户端驱动,或者调用pilosa API。
151+
152+
## PostgreSQL 比特流类型
153+
PostgreSQL 支持varbit类型,同时包含了一些bit的操作符,例如位移、与、或、异或、获取位置BIT等。
154+
155+
### 阿里云RDS PostgreSQL varbitx
156+
阿里云rds PostgreSQL varbitx是varbit类型的扩展包,支持更多的BIT操作,例如SET BIT,批量SET,按数组提供的位置SET,求BIT COUNT,求指定位置范围的BIT COUNT,求特定数组提供的位置的BIT COUNT等。
157+
158+
详细介绍如下
159+
160+
[《阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍》](../201705/20170502_01.md)
161+
162+
## PG varbit 应用
163+
例如实时数据分析(与pilosa类似),基于varbit的人物画像,按标签圈人。门禁广告销售系统等。
164+
165+
## 小结
166+
pilosa是一套golang编写的bitmap库,通过PostgreSQL plgo应该可以将其嫁接到PostgreSQL中,作为一个插件库来使用。
167+
168+
https://github.com/microo8/plgo
169+
170+
## 参考
171+
172+
https://github.com/zeromax007/gpdb-roaringbitmap
173+
174+
[《阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍》](../201705/20170502_01.md)
175+
176+
[《PostgreSQL bitmapAnd, bitmapOr, bitmap index scan, bitmap heap scan》](../201702/20170221_02.md)
177+
178+
[《基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统》](../201610/20161021_01.md)
179+
180+
[《PostgreSQL 与 12306 抢火车票的思考》](../201611/20161124_02.md)
181+
182+
[《门禁广告销售系统需求剖析 与 PostgreSQL数据库实现》](../201611/20161124_01.md)
183+
184+
https://www.pilosa.com/
185+
186+
[《PostgreSQL 9.6 sharding based on FDW & pg_pathman》](../201610/20161027_01.md)
187+
188+

201706/20170612_01_pic_001.jpg

166 KB
Loading

201706/20170612_01_pic_002.jpg

103 KB
Loading

201706/20170612_01_pic_003.jpg

130 KB
Loading

201706/20170612_01_pic_004.jpg

74.2 KB
Loading

201706/20170612_01_pic_005.jpg

109 KB
Loading

201706/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
### 文章列表
22
----
3+
##### 20170612_01.md [《PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap库)》](20170612_01.md)
34
##### 20170611_02.md [《PostgreSQL 并行写入堆表,如何保证时序线性存储 - BRIN索引优化》](20170611_02.md)
45
##### 20170611_01.md [《为什么PostgreSQL是"最先进的开源数据库"》](20170611_01.md)
56
##### 20170607_02.md [《多字段,任意组合条件查询(无需建模) - 毫秒级实时圈人 最佳实践》](20170607_02.md)

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ digoal's|PostgreSQL|文章|归类
2828

2929
### 未归类文档如下
3030
----
31+
##### 201706/20170612_01.md [《PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap库)》](201706/20170612_01.md)
3132
##### 201706/20170611_02.md [《PostgreSQL 并行写入堆表,如何保证时序线性存储 - BRIN索引优化》](201706/20170611_02.md)
3233
##### 201706/20170611_01.md [《为什么PostgreSQL是"最先进的开源数据库"》](201706/20170611_01.md)
3334
##### 201706/20170607_02.md [《多字段,任意组合条件查询(无需建模) - 毫秒级实时圈人 最佳实践》](201706/20170607_02.md)

0 commit comments

Comments
 (0)