跳至主要内容

位图函数

位图可以通过两种方式构建。第一种方式是通过聚合函数 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)

参数

  • bitmap位图对象.
  • range_start – 范围的起始值(包含)。UInt32.
  • range_end – 范围的结束值(不包含)。UInt32.

示例

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)

参数

  • bitmap位图对象.
  • range_start – 范围的起始值(包含)。UInt32.
  • cardinality_limit – 子集的最大基数。 UInt32.

示例

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)

参数

  • bitmap – 位图。位图对象.
  • offset – 子集第一个元素的位置。UInt32.
  • cardinality_limit – 子集中元素的最大数量。UInt32.

示例

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)

参数

返回值

  • 0 — 如果 bitmap 不包含 needleUInt8.
  • 1 — 如果 bitmap 包含 needleUInt8.

示例

SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res;

结果

┌─res─┐
│ 1 │
└─────┘

bitmapHasAny

检查两个位图是否相交。

如果 bitmap2 恰好包含一个元素,建议使用 bitmapContains,因为它效率更高。

语法

bitmapHasAny(bitmap1, bitmap2)

参数

  • bitmap1 – 位图对象 1。
  • bitmap2 – 位图对象 2。

返回值

  • 1,如果 bitmap1bitmap2 至少有一个共享元素。
  • 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_arrayto_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 │
└─────┘