ClickHouse位图函数的用法

一、位图函数的概念

位图函数用于对两个位图对象进行计算,对于任何一个位图函数,计算结果都将返回一个位图对象。

二、位图对象的构造方法

位图对象有两种构造方法。其一是由聚合函数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等。

猜你喜欢

转载自blog.csdn.net/Bertil/article/details/111087373