ClickHouse/docs/zh/sql-reference/functions/bitmap-functions.md

8.9 KiB
Raw Blame History

位图函数

位图函数用于对两个位图对象进行计算对于任何一个位图函数它都将返回一个位图对象例如andorxornot等等。

位图对象有两种构造方法。一个是由聚合函数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] │
└─────────────────────────────────┘

bitmapContains

检查位图是否包含指定元素。

bitmapContains(haystack, needle)

参数

  • haystack 位图对象.
  • needle 元素类型UInt32.

示例

SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res
┌─res─┐
│  1  │
└─────┘

bitmapHasAny

hasAny(arrayarray)类似如果位图有任何公共元素则返回1否则返回0。 对于空位图返回0。

bitmapHasAny(bitmap,bitmap)

参数

  • bitmap bitmap对象。

示例

SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
┌─res─┐
│  1  │
└─────┘

bitmapHasAll

hasAll(arrayarray)类似如果第一个位图包含第二个位图的所有元素则返回1否则返回0。 如果第二个参数是空位图则返回1。

bitmapHasAll(bitmap,bitmap)

参数

  • bitmap bitmap 对象。

示例

SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
┌─res─┐
│  0  │
└─────┘

位图和

为两个位图对象进行与操作,返回一个新的位图对象。

bitmapAnd(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res─┐
│ [3] │
└─────┘

位图或

为两个位图对象进行或操作,返回一个新的位图对象。

bitmapOr(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘

bitmapXor

为两个位图对象进行异或操作,返回一个新的位图对象。

bitmapXor(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res───────┐
│ [1,2,4,5] │
└───────────┘

bitmapAndnot

计算两个位图的差异,返回一个新的位图对象。

bitmapAndnot(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
┌─res───┐
│ [1,2] │
└───────┘

bitmapCardinality

返回一个UInt64类型的数值表示位图对象的基数。

bitmapCardinality(bitmap)

参数

  • bitmap 位图对象。

示例

SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res─┐
│   5 │
└─────┘

bitmapMin

返回一个UInt64类型的数值表示位图中的最小值。如果位图为空则返回UINT32_MAX。

bitmapMin(bitmap)

参数

  • bitmap 位图对象。

示例

SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res─┐
│   1 │
└─────┘

bitmapMax

返回一个UInt64类型的数值表示位图中的最大值。如果位图为空则返回0。

bitmapMax(bitmap)

参数

  • bitmap 位图对象。

示例

SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res
┌─res─┐
│   5 │
└─────┘

位图和标准性

为两个位图对象进行与操作,返回结果位图的基数。

bitmapAndCardinality(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapOrCardinality

为两个位图进行或运算,返回结果位图的基数。

bitmapOrCardinality(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   5 │
└─────┘

bitmapXorCardinality

为两个位图进行异或运算,返回结果位图的基数。

bitmapXorCardinality(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 位图对象。

示例

SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   4 │
└─────┘

位图和非标准性

计算两个位图的差异,返回结果位图的基数。

bitmapAndnotCardinality(bitmap1,bitmap2)

参数

  • bitmap1 位图对象。
  • bitmap2 - 位图对象。

示例

SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   2 │
└─────┘

来源文章