位图函数
位图可以通过两种方式构建。第一种方式是通过聚合函数 groupBitmap 使用 -State
构建,另一种方式是从 Array 对象构建位图。
bitmapBuild
从无符号整数数组构建位图。
语法
bitmapBuild(array)
参数
array
– 无符号整数数组。
示例
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res);
┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐
│ │ AggregateFunction(groupBitmap, UInt8) │
└─────┴──────────────────────────────────────────────┘
bitmapToArray
将位图转换为整数数组。
语法
bitmapToArray(bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;
结果
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
bitmapSubsetInRange
返回位图的子集,其中位位于值区间内。
语法
bitmapSubsetInRange(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
返回位图的子集,其中最小的位值为 range_start
,且最多包含 cardinality_limit
个元素。
语法
bitmapSubsetLimit(bitmap, range_start, cardinality_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
开始。返回位图的最大基数为 cardinality_limit
。
语法
subBitmap(bitmap, offset, cardinality_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] │
└─────────────────────────────────┘
bitmapContains
检查位图是否包含元素。
bitmapContains(bitmap, needle)
参数
返回值
示例
SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res;
结果
┌─res─┐
│ 1 │
└─────┘
bitmapHasAny
检查两个位图是否相交。
如果 bitmap2
恰好包含一个元素,建议使用 bitmapContains,因为它效率更高。
语法
bitmapHasAny(bitmap1, bitmap2)
参数
bitmap1
– 位图对象 1。bitmap2
– 位图对象 2。
返回值
1
,如果bitmap1
和bitmap2
至少有一个共享元素。0
,否则。
示例
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 1 │
└─────┘
bitmapHasAll
如果第一个位图包含第二个位图的所有元素,则返回 1,否则返回 0。如果第二个位图为空,则返回 1。
另请参见 hasAll(array, array)
。
语法
bitmapHasAll(bitmap1, bitmap2)
参数
bitmap1
– 位图对象 1。bitmap2
– 位图对象 2。
示例
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 0 │
└─────┘
bitmapCardinality
返回位图的基数。
语法
bitmapCardinality(bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res;
结果
┌─res─┐
│ 5 │
└─────┘
bitmapMin
计算位图中设置的最小的位,如果位图为空,则返回 UINT32_MAX。
语法
bitmapMin(bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res;
结果
┌─res─┐
│ 1 │
└─────┘
bitmapMax
计算位图中设置的最大位,如果位图为空,则返回 0。
语法
bitmapMax(bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;
结果
┌─res─┐
│ 5 │
└─────┘
bitmapTransform
在位图中最多替换 N 个位。被替换的第 i 个位的旧值和新值由 from_array[i]
和 to_array[i]
给出。
结果取决于 from_array
和 to_array
的数组顺序。
语法
bitmapTransform(bitmap, from_array, to_array)
参数
bitmap
– 位图对象。from_array
– UInt32 数组。对于 idx 在范围内[0,from_array.size()),如果位图包含 from_array[idx],则用 to_array 替换它[idx].to_array
– 与from_array
大小相同的 UInt32 数组。
示例
SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res;
结果
┌─res───────────────────┐
│ [1,3,4,6,7,8,9,10,20] │
└───────────────────────┘
bitmapAnd
计算两个位图的逻辑合取。
语法
bitmapAnd(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
结果
┌─res─┐
│ [3] │
└─────┘
bitmapOr
计算两个位图的逻辑析取。
语法
bitmapOr(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
结果
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
bitmapXor
对两个位图进行异或操作。
语法
bitmapXor(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
结果
┌─res───────┐
│ [1,2,4,5] │
└───────────┘
bitmapAndnot
计算两个位图的逻辑合取,并对结果取反。
语法
bitmapAndnot(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
结果
┌─res───┐
│ [1,2] │
└───────┘
bitmapAndCardinality
返回两个位图的逻辑合取的基数。
语法
bitmapAndCardinality(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 1 │
└─────┘
bitmapOrCardinality
返回两个位图的逻辑析取的基数。
bitmapOrCardinality(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 5 │
└─────┘
bitmapXorCardinality
返回两个位图的异或运算的基数。
bitmapXorCardinality(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 4 │
└─────┘
bitmapAndnotCardinality
返回两个位图的 AND-NOT 操作的基数。
bitmapAndnotCardinality(bitmap,bitmap)
参数
bitmap
– 位图对象。
示例
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
结果
┌─res─┐
│ 2 │
└─────┘