一、位图函数的概念
位图函数用于对两个位图对象进行计算,对于任何一个位图函数,计算结果都将返回一个位图对象。
二、位图对象的构造方法
位图对象有两种构造方法。其一是由聚合函数groupBitmapState构造的,其二是由Array Object构造的。同时还可以将位图对象转化为数组对象。
三、位图函数的用法
(一)构造位图
bitmapBuild
从无符号整数数组构建位图对象
bitmapBuild(array)
注:array – 无符号整数数组
select bitmapBuild([1, 2, 3, 4, 5]) as result
(二)位图对象转化为数组对象
bitmapToArray
将位图转换为整数数组
bitmapToArray(bitmap)
注:bitmap – 位图对象
select bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) as result
(三)位图对象的属性
1.bitmapContains
检查位图是否包含指定元素
bitmapContains(haystack, needle)
注:
haystack – 位图对象
needle – 元素,类型UInt32
select bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) as result
2.bitmapCardinality
返回一个UInt64类型的数值,表示位图对象的基数
bitmapCardinality(bitmap)
注:bitmap – 位图对象
select bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) as result
3.bitmapMin
返回一个UInt64类型的数值,表示位图中的最小值。如果位图为空则返回UINT32_MAX
bitmapMin(bitmap)
注:bitmap – 位图对象
select bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) as result
4.bitmapMax
返回一个UInt64类型的数值,表示位图中的最大值。如果位图为空则返回0
bitmapMax(bitmap)
注:bitmap – 位图对象
select bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) as result
(四)位图转换为新位图
1.bitmapSubsetInRange
将位图指定范围(不包含range_end)转换为另一个位图
bitmapSubsetInRange(bitmap, range_start, range_end)
注:
bitmap – 位图对象
range_start – 范围起始点(含)
range_end – 范围结束点(不含)
select bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) as result
2.bitmapSubsetLimit
将位图指定范围(起始点和数目上限)转换为另一个位图
bitmapSubsetLimit(bitmap, range_start, limit)
注:
bitmap – 位图对象
range_start – 范围起始点(含)
limit – 子位图基数上限
select bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) as result
(五)位图运算
1.bitmapHasAny
与hasAny(array,array)类似,如果位图有任何公共元素则返回1,否则返回0。
对于空位图,返回0。
bitmapHasAny(bitmap,bitmap)
注:bitmap – bitmap对象
select bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
2.bitmapHasAll
与hasAll(array,array)类似,如果第一个位图包含第二个位图的所有元素,则返回1,否则返回0。
如果第二个参数是空位图,则返回1。
bitmapHasAll(bitmap,bitmap)
注:bitmap – bitmap 对象
select bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
3.bitmapAnd
为两个位图对象进行与操作,返回一个新的位图对象
bitmapAnd(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
4.bitmapOr
为两个位图对象进行或操作,返回一个新的位图对象
bitmapOr(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
5.bitmapXor
为两个位图对象进行异或操作,返回一个新的位图对象
bitmapXor(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
6.bitmapAndnot
计算两个位图的差异,返回一个新的位图对象
bitmapAndnot(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) as result
7.bitmapAndCardinality
为两个位图对象进行与操作,返回结果位图的基数
bitmapAndCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
8.bitmapOrCardinality
为两个位图进行或运算,返回结果位图的基数
bitmapOrCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
9.bitmapXorCardinality
为两个位图进行异或运算,返回结果位图的基数
bitmapXorCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
10.bitmapAndnotCardinality
计算两个位图的差异,返回结果位图的基数
bitmapAndnotCardinality(bitmap1,bitmap2)
注:
bitmap1 – 位图对象
bitmap2 – 位图对象
select bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) as result
四、总结
位图对象有两种构造方法。其一是由聚合函数groupBitmapState构造的,其二是由Array Object构造的。同时还可以将位图对象转化为数组对象。对于任何一个位图函数,计算结果都将返回一个位图对象。带有Has的判断函数返回的数值是逻辑值0或者1;带有Cardinality后缀的函数返回的数值是运算后的结果位图的基数;其他的位图运算返回的是结果位图,例如And,Or,Xor,Andnot等。