ClickHouse/docs/zh/query_language/functions/bitmap_functions.md

333 lines
5.8 KiB
Markdown
Raw Normal View History

2019-05-05 17:38:05 +00:00
# 位图函数
位图函数用于对两个位图对象进行计算对于任何一个位图函数它都将返回一个位图对象例如andorxornot等等。
位图对象有两种构造方法。一个是由聚合函数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(arrayarray)`类似如果位图有任何公共元素则返回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(arrayarray)`类似如果第一个位图包含第二个位图的所有元素则返回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-->