2020-03-20 18:20:59 +00:00
# 位图函数 {#wei-tu-han-shu}
位图函数用于对两个位图对象进行计算, 对于任何一个位图函数, 它都将返回一个位图对象, 例如and, or, xor, not等等。
位图对象有两种构造方法。一个是由聚合函数groupBitmapState构造的, 另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。
我们使用RoaringBitmap实际存储位图对象, 当基数小于或等于32时, 它使用Set保存。当基数大于32时, 它使用RoaringBitmap保存。这也是为什么低基数集的存储更快的原因。
2020-04-08 14:22:25 +00:00
有关RoaringBitmap的更多信息, 请参阅: [呻吟声](https://github.com/RoaringBitmap/CRoaring)。
2020-03-20 18:20:59 +00:00
## bitmapBuild {#bitmapbuild}
从无符号整数数组构建位图对象。
2020-03-21 04:11:51 +00:00
bitmapBuild(array)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `array` – 无符号整数数组.
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res
```
## bitmapToArray {#bitmaptoarray}
将位图转换为整数数组。
2020-03-21 04:11:51 +00:00
bitmapToArray(bitmap)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象.
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
2020-03-20 18:20:59 +00:00
## bitmapSubsetInRange {#bitmapsubsetinrange}
将位图指定范围( 不包含range\_end) 转换为另一个位图。
2020-03-21 04:11:51 +00:00
bitmapSubsetInRange(bitmap, range_start, range_end)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象.
- `range_start` – 范围起始点(含).
- `range_end` – 范围结束点(不含).
2020-03-20 18:20:59 +00:00
**示例**
``` sql
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
```
2020-03-21 04:11:51 +00:00
┌─res───────────────┐
│ [30,31,32,33,100] │
└───────────────────┘
2020-03-20 18:20:59 +00:00
## bitmapSubsetLimit {#bitmapsubsetlimit}
将位图指定范围(起始点和数目上限)转换为另一个位图。
2020-03-21 04:11:51 +00:00
bitmapSubsetLimit(bitmap, range_start, limit)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象.
- `range_start` – 范围起始点(含).
- `limit` – 子位图基数上限.
2020-03-20 18:20:59 +00:00
**示例**
``` sql
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
```
2020-03-21 04:11:51 +00:00
┌─res───────────────────────┐
│ [30,31,32,33,100,200,500] │
└───────────────────────────┘
2020-03-20 18:20:59 +00:00
## bitmapContains {#bitmapcontains}
检查位图是否包含指定元素。
2020-03-21 04:11:51 +00:00
bitmapContains(haystack, needle)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `haystack` – 位图对象.
- `needle` – 元素, 类型UInt32.
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res
```
``` text
┌─res─┐
│ 1 │
└─────┘
```
## bitmapHasAny {#bitmaphasany}
与`hasAny(array, array)`类似, 如果位图有任何公共元素则返回1, 否则返回0。
对于空位图, 返回0。
2020-03-21 04:11:51 +00:00
bitmapHasAny(bitmap,bitmap)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap` – bitmap对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 1 │
└─────┘
2020-03-20 18:20:59 +00:00
## bitmapHasAll {#bitmaphasall}
与`hasAll(array, array)`类似, 如果第一个位图包含第二个位图的所有元素, 则返回1, 否则返回0。
如果第二个参数是空位图, 则返回1。
2020-03-21 04:11:51 +00:00
bitmapHasAll(bitmap,bitmap)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap` – bitmap 对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 0 │
└─────┘
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
## 位图和 {#bitmapand}
2020-03-20 18:20:59 +00:00
为两个位图对象进行与操作,返回一个新的位图对象。
2020-03-21 04:11:51 +00:00
bitmapAnd(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ [3] │
└─────┘
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
## 位图 {#bitmapor}
2020-03-20 18:20:59 +00:00
为两个位图对象进行或操作,返回一个新的位图对象。
2020-03-21 04:11:51 +00:00
bitmapOr(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
**参数**
2020-03-20 18:20:59 +00:00
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
2020-03-20 18:20:59 +00:00
## bitmapXor {#bitmapxor}
为两个位图对象进行异或操作,返回一个新的位图对象。
2020-03-21 04:11:51 +00:00
bitmapXor(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
```
2020-03-21 04:11:51 +00:00
┌─res───────┐
│ [1,2,4,5] │
└───────────┘
2020-03-20 18:20:59 +00:00
## bitmapAndnot {#bitmapandnot}
计算两个位图的差异,返回一个新的位图对象。
2020-03-21 04:11:51 +00:00
bitmapAndnot(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
```
2020-03-21 04:11:51 +00:00
┌─res───┐
│ [1,2] │
└───────┘
2020-03-20 18:20:59 +00:00
## bitmapCardinality {#bitmapcardinality}
返回一个UInt64类型的数值, 表示位图对象的基数。
2020-03-21 04:11:51 +00:00
bitmapCardinality(bitmap)
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
**参数**
2020-03-20 18:20:59 +00:00
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 5 │
└─────┘
2020-03-20 18:20:59 +00:00
## bitmapMin {#bitmapmin}
返回一个UInt64类型的数值, 表示位图中的最小值。如果位图为空则返回UINT32\_MAX。
2020-03-21 04:11:51 +00:00
bitmapMin(bitmap)
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
**参数**
2020-03-20 18:20:59 +00:00
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 1 │
└─────┘
2020-03-20 18:20:59 +00:00
## bitmapMax {#bitmapmax}
返回一个UInt64类型的数值, 表示位图中的最大值。如果位图为空则返回0。
2020-03-21 04:11:51 +00:00
bitmapMax(bitmap)
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
**参数**
2020-03-20 18:20:59 +00:00
2020-03-21 04:11:51 +00:00
- `bitmap` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 5 │
└─────┘
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
## 位图和标准性 {#bitmapandcardinality}
2020-03-20 18:20:59 +00:00
为两个位图对象进行与操作,返回结果位图的基数。
2020-03-21 04:11:51 +00:00
bitmapAndCardinality(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 1 │
└─────┘
2020-03-20 18:20:59 +00:00
## bitmapOrCardinality {#bitmaporcardinality}
为两个位图进行或运算,返回结果位图的基数。
2020-03-21 04:11:51 +00:00
bitmapOrCardinality(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 5 │
└─────┘
2020-03-20 18:20:59 +00:00
## bitmapXorCardinality {#bitmapxorcardinality}
为两个位图进行异或运算,返回结果位图的基数。
2020-03-21 04:11:51 +00:00
bitmapXorCardinality(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` – 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 4 │
└─────┘
2020-03-20 18:20:59 +00:00
2020-04-08 14:22:25 +00:00
## 位图和非标准性 {#bitmapandnotcardinality}
2020-03-20 18:20:59 +00:00
计算两个位图的差异,返回结果位图的基数。
2020-03-21 04:11:51 +00:00
bitmapAndnotCardinality(bitmap1,bitmap2)
2020-03-20 18:20:59 +00:00
**参数**
2020-03-21 04:11:51 +00:00
- `bitmap1` – 位图对象。
- `bitmap2` - 位图对象。
2020-03-20 18:20:59 +00:00
**示例**
``` sql
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
```
2020-03-21 04:11:51 +00:00
┌─res─┐
│ 2 │
└─────┘
2020-03-20 18:20:59 +00:00
[来源文章 ](https://clickhouse.tech/docs/en/query_language/functions/bitmap_functions/ ) <!--hide-->