2019-05-05 17:38:05 +00:00
|
|
|
|
# 位图函数
|
|
|
|
|
|
|
|
|
|
位图函数用于对两个位图对象进行计算,对于任何一个位图函数,它都将返回一个位图对象,例如and,or,xor,not等等。
|
|
|
|
|
|
|
|
|
|
位图对象有两种构造方法。一个是由聚合函数groupBitmapState构造的,另一个是由Array Object构造的。同时还可以将位图对象转化为数组对象。
|
|
|
|
|
|
|
|
|
|
我们使用RoaringBitmap实际存储位图对象,当基数小于或等于32时,它使用Set保存。当基数大于32时,它使用RoaringBitmap保存。这也是为什么低基数集的存储更快的原因。
|
|
|
|
|
|
|
|
|
|
有关RoaringBitmap的更多信息,请参阅:[CRoaring](https://github.com/RoaringBitmap/CRoaring)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## bitmapBuild
|
|
|
|
|
|
|
|
|
|
从无符号整数数组构建位图对象。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapBuild(array)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `array` – 无符号整数数组.
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapToArray
|
|
|
|
|
|
|
|
|
|
将位图转换为整数数组。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapToArray(bitmap)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap` – 位图对象.
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─────────┐
|
|
|
|
|
│ [1,2,3,4,5] │
|
|
|
|
|
└─────────────┘
|
|
|
|
|
```
|
|
|
|
|
|
2019-06-05 10:04:00 +00:00
|
|
|
|
## bitmapHasAny
|
|
|
|
|
|
|
|
|
|
与`hasAny(array,array)`类似,如果位图有任何公共元素则返回1,否则返回0。
|
|
|
|
|
对于空位图,返回0。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapHasAny(bitmap,bitmap)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap` – bitmap对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 1 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapHasAll
|
|
|
|
|
|
|
|
|
|
与`hasAll(array,array)`类似,如果第一个位图包含第二个位图的所有元素,则返回1,否则返回0。
|
|
|
|
|
如果第二个参数是空位图,则返回1。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapHasAll(bitmap,bitmap)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap` – bitmap 对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 0 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
2019-05-05 17:38:05 +00:00
|
|
|
|
|
|
|
|
|
## bitmapAnd
|
|
|
|
|
|
|
|
|
|
为两个位图对象进行与操作,返回一个新的位图对象。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapAnd(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ [3] │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## bitmapOr
|
|
|
|
|
|
|
|
|
|
为两个位图对象进行或操作,返回一个新的位图对象。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapOr(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Parameters**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
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` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res───────┐
|
|
|
|
|
│ [1,2,4,5] │
|
|
|
|
|
└───────────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapAndnot
|
|
|
|
|
|
|
|
|
|
计算两个位图的差异,返回一个新的位图对象。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapAndnot(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res───┐
|
|
|
|
|
│ [1,2] │
|
|
|
|
|
└───────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapCardinality
|
|
|
|
|
|
|
|
|
|
返回一个UInt64类型的数值,表示位图对象的基数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapCardinality(bitmap)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**Parameters**
|
|
|
|
|
|
|
|
|
|
- `bitmap` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 5 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapAndCardinality
|
|
|
|
|
|
|
|
|
|
为两个位图对象进行与操作,返回结果位图的基数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapAndCardinality(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 1 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## bitmapOrCardinality
|
|
|
|
|
|
|
|
|
|
为两个位图进行或运算,返回结果位图的基数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapOrCardinality(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 5 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## bitmapXorCardinality
|
|
|
|
|
|
|
|
|
|
为两个位图进行异或运算,返回结果位图的基数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapXorCardinality(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` – 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 4 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## bitmapAndnotCardinality
|
|
|
|
|
|
|
|
|
|
计算两个位图的差异,返回结果位图的基数。
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bitmapAndnotCardinality(bitmap1,bitmap2)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
**参数**
|
|
|
|
|
|
|
|
|
|
- `bitmap1` – 位图对象。
|
|
|
|
|
- `bitmap2` - 位图对象。
|
|
|
|
|
|
|
|
|
|
**示例**
|
|
|
|
|
|
|
|
|
|
``` sql
|
|
|
|
|
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─res─┐
|
|
|
|
|
│ 2 │
|
|
|
|
|
└─────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[来源文章](https://clickhouse.yandex/docs/en/query_language/functions/bitmap_functions/) <!--hide-->
|