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