阿裏雲RDS for PostgreSQL varbitx插件與實時畫像應用場景介紹
標簽
PostgreSQL , varbitx , 阿裏雲 , 實時畫像
背景
PostgreSQL 內置的varbit, bit類型的操作函數比較簡單,阿裏雲RDS for PostgreSQL對其進行了擴展。
支持更多的bit操作,可以覆蓋更廣的應用場景,例如實時用戶畫像推薦係統、門禁廣告係統、購票係統等。
阿裏雲 varbitx 插件介紹
增加的函數接口如下
1. bit_count
bit_count (
varbit,
int, -- (0|1)
int, -- (n)
int -- (N)
) returns int
從第n位開始(起始位=0),統計N個BIT位中有多少個0|1,如果N超出長度,則隻計算已經存在的。
例如 bit_count('1111000011110000', 1, 5, 4) 返回 1 -- (0001)
2. bit_count
bit_count (
varbit,
int
) returns int
統計整個bit string中0|1的個數。
例如 bit_count('1111000011110000', 1) 返回 8
3. bit_count_array
bit_count_array (
varbit,
int,
int[] -- 位置數組, (起始位=0)
) returns int
統計指定位置bit string中0|1的個數。
例如 bit_count_array('1111000011110000', 1, array[1,2,7,8]) 返回 3 -- (1,1,0,1)
4. bit_fill
bit_fill (
int, -- (0|1)
int -- BIT string 長度
) returns varbit
填充指定長度的0 或 1
例如 bit_fill(0,10) 返回 '0000000000'
5. bit_posite
bit_posite (
varbit,
int, -- (0|1)
boolean
) returns int[]
返回 0|1 的位置,(起始位=0), true時正向返回,false時反向返回
例如 bit_posite ('11110010011', 1, true) 返回 [0,1,2,3,6,9,10]
bit_posite ('11110010011', 1, false) 返回 [10,9,6,3,2,1,0]
6. bit_posite
bit_posite (
varbit,
int, -- (0|1)
int, -- N
boolean
) returns int[]
返回 0|1 的位置,(起始位=0),true時正向返回,false時反向返回,返回N個為止
例如 bit_posite ('11110010011', 1, 3, true) 返回 [0,1,2]
bit_posite ('11110010011', 1, 3, false) 返回 [10,9,6]
7. get_bit
get_bit (
varbit,
int, -- n
int -- N
) returns varbit
從指定位置n開始獲取N個BIT位,(起始位=0),返回varbit
例如 get_bit('111110000011', 3, 5) 返回11000
8. get_bit_array
get_bit_array (
varbit,
int, -- n
int, -- N
int -- (0|1)
) returns int[]
從指定位置n開始獲取N個BIT位,返回0|1的位置下標,(起始位=0)
例如 get_bit_array('111110000011', 3, 5, 1) 返回11000的下標 array[3,4]
9. get_bit_array
get_bit_array (
varbit,
int, -- (0|1)
int[] -- 位置數組
) returns int[]
查詢指定位置的BIT,返回其中是0|1的BIT的位置(起始位=0) ,返回下標,超出不統計
例如 get_bit_array('111110000011', 1, array[1,5,6,7,10,11]) 返回array[1,10,11]
10. set_bit_array
set_bit_array (
varbit,
int, -- 目標BIT (0|1)
int, -- 填充BIT (0|1)
int[] -- 目標位置
) returns varbit
將指定位置的BIT設置為0|1,(起始位=0),超出原始長度的部分填充0|1
例如 set_bit_array('111100001111', 0, 1, array[1,15]) 返回 1011000011111110
11. set_bit_array
set_bit_array (
varbit,
int, -- 目標BIT (0|1)
int, -- 填充BIT (0|1)
int[], -- 目標位置
int -- 成功設置若幹位
) returns varbit
將指定位置的BIT設置為0|1,(起始位=0),超出原始長度的部分填充0|1 , 首先填充,設置N位即返回
例如 set_bit_array('111110001111', 1, 0, array[4,5,6,15], 2) 返回 1111111011110000 ( 設置為1, 超出補0, 成功設置滿2位即返回 (成功設置指將原來的0設置為1或反之,如果原來已經是目標值則不算數) )
12. set_bit_array_record
set_bit_array_record (
varbit,
int, -- 目標BIT (0|1)
int, -- 填充BIT (0|1)
int[] -- 目標位置
) returns (varbit,int[])
將指定位置的BIT設置為0|1,(起始位=0),超出原始長度的部分填充0|1
返回設置後的varbit
同時返回(原來不是0|1)此次被設置為0|1的位置數組
例如 set_bit_array_record('111100001111', 0, 1, array[1,15]) 返回 1011000011111110 (設置為0, 超出補1)
同時返回array[1,15] (超出原始長度的不返回)
13. set_bit_array_record
set_bit_array_record (
varbit,
int, -- 目標BIT (0|1)
int, -- 填充BIT (0|1)
int[], -- 目標位置
int -- 成功設置若幹位
) returns (varbit,int[])
將指定位置的BIT設置為0|1,(起始位=0),超出原始長度的部分填充0|1 , 設置N位即返回
返回設置後的varbit
同時返回(原來不是0|1)此次被設置為0|1的位置數組
例如 set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2) 返回 111111001111 (設置為1, 超出補0, 設置滿2位即返回 (成功設置指將原來的0設置為1或反之,如果原來已經是目標值則不算數) )
同時返回array[4,5] (超出原始長度的不返回)
使用 varbitx
例子
test=> create extension varbitx;
CREATE EXTENSION
test=> select bit_count('1111000011110000', 1, 5, 4);
bit_count
-----------
1
(1 row)
test=> select bit_count('1111000011110000', 1);;
bit_count
-----------
8
(1 row)
test=> select bit_count_array('1111000011110000', 1, array[1,2,7,8]);
bit_count_array
-----------------
3
(1 row)
test=> select bit_fill(0,10);
bit_fill
------------
0000000000
(1 row)
test=> select bit_posite ('11110010011', 1, true);
bit_posite
------------------
{0,1,2,3,6,9,10}
(1 row)
test=> select bit_posite ('11110010011', 1, false);
bit_posite
------------------
{10,9,6,3,2,1,0}
(1 row)
test=> select bit_posite ('11110010011', 1, 3, true);
bit_posite
------------
{0,1,2}
(1 row)
test=> select bit_posite ('11110010011', 1, 3, false);
bit_posite
------------
{10,9,6}
(1 row)
test=> select get_bit('111110000011', 3, 5);
get_bit
---------
11000
(1 row)
test=> select get_bit_array('111110000011', 3, 5, 1);
get_bit_array
---------------
{3,4}
(1 row)
test=> select get_bit_array('111110000011', 1, array[1,5,6,7,10,11]);
get_bit_array
---------------
{1,10,11}
(1 row)
test=> select set_bit_array('111100001111', 0, 1, array[1,15]);
set_bit_array
------------------
1011000011111110
(1 row)
test=> select set_bit_array('111110001111', 1, 0, array[4,5,6,15], 2);
set_bit_array
------------------
1111111011110000
(1 row)
test=> select set_bit_array_record('111100001111', 0, 1, array[1,15]);
set_bit_array_record
-----------------------------
(1011000011111110,"{1,15}")
(1 row)
test=> select set_bit_array_record('111100001111', 1, 0, array[1,4,5,6,7], 2);
set_bit_array_record
------------------------
(111111001111,"{4,5}")
(1 row)
案例
最後更新:2017-05-03 21:49:06