位图函数
位图函数用于对两个位图对象进行计算,对于任何一个位图函数,它都将返回一个位图对象,例如and,or,xor,not等等。
位图对象有两种构造方法。一个是由聚合函数groupBitmapState构造的,另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。
我们使用RoaringBitmap实际存储位图对象,当基数小于或等于32时,它使用Set保存。当基数大于32时,它使用RoaringBitmap保存。这也是为什么低基数集的存储更快的原因。
有关RoaringBitmap的更多信息,请参阅:RoaringBitmap。
bitmapBuild
从无符号整数数组构建位图对象。
bitmapBuild(array)
参数
array
– 无符号整数数组.
示例
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res
bitmapToArray
将位图转换为整数数组。
bitmapToArray(bitmap)
参数
bitmap
– 位图对象.
示例
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res─────────┐ │ [1,2,3,4,5] │ └─────────────┘
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 res
┌─res───────────────┐ │ [30,31,32,33,100] │ └───────────────────┘
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 res
┌─res───────────────────────┐ │ [30,31,32,33,100,200,500] │ └───────────────────────────┘
subBitmap
将位图跳过offset
个元素,限制大小为limit
个的结果转换为另一个位图。
subBitmap(bitmap, offset, limit)
参数
bitmap
– 位图对象.offset
– 跳过多少个元素.limit
– 子位图基数上限.
示例
SELECT bitmapToArray(subBitmap(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(10), toUInt32(10))) AS res
┌─res─────────────────────────────┐
│ [10,11,12,13,14,15,16,17,18,19] │
└─────────────────────────────────┘