Clickhouse Bitmap 类型操作总结—— Clickhouse 基础篇(四)

文章目录

Bitmap 类型说明

  • ClickHouse中的Bitmap对象,本质上是聚合函数类型AggregateFunction(groupBitmap, UInt*)
  • 使用 Bitmap 存储无符号整数,可以节省存储空间,无法直接查询Bitmap 中的数据,需要转换为数组才可以查看。
  • 可以通过 groupBitmap(expr)快速求去重后的总数,等价于 count(distinct expr)

创建 Bitmap 对象

它有两种构造方法:

  • 通过 bitmapBuild 将无符号整数数组转换为 Bitmap 对象

    sql 复制代码
    SELECT bitmapBuild([1,2,3]) AS res
  • 使用聚合函数groupBitmapState创建Bitmap对象, 将无符号整数列转换为 Bitmap 对象。

    sql 复制代码
    SELECT 
      groupBitmapState(UserID) AS res
    FROM hits_v1
    where UserID IN ()

    快速求去重后的数量:

    sql 复制代码
    # 等价于 count(distinct(UserID))
    SELECT groupBitmap(UserID) AS res FROM hits_v1

    输出如下:

Bitmap 转换为整数数组

bitmapBuild(array)

sql 复制代码
select bitmapBuild([1,2,3]) AS res, bitmapToArray(res) AS arr;

################
┌─res─┬─arr─────┐
│     │ [1,2,3] │
└─────┴─────────┘

计算总数(去重)值

bitmapCardinality(bitmap)

数组中的元素为 Uint64 类型的

sql 复制代码
SELECT bitmapCardinality(bitmapBuild([1,2,3,4,5,5,5])) AS res;

#################
┌─res─┐
│   5 │
└─────┘

指定start, end 索引生成子 Bitmap

bitmapSubsetInRange(bitmap, range_start, range_end)

sql 复制代码
SELECT bitmapToArray(bitmapSubsetInRange(
  bitmapBuild([0,1,2,3,4,5,6,7,8]), toUInt32(1), toUInt32(3))) AS res;

################
┌─res───┐
│ [1,2] │
└───────┘

指定 start 索引和数量限制生成子 Bitmap

bitmapSubsetLimit(bitmap, range_start, cardinality_limit)

sql 复制代码
SELECT bitmapToArray(bitmapSubsetLimit(
  bitmapBuild([0,1,2,3,4,5,6,7,8]), toUInt32(3), toUInt32(30))) AS res;

################
┌─res───────────┐
│ [3,4,5,6,7,8] │
└───────────────┘

指定偏移量生成子 Bitmap

subBitmap(bitmap, offset, cardinality_limit)

偏移量从0开始

sql 复制代码
SELECT bitmapToArray(subBitmap(
  bitmapBuild([0,1,2,3,4,5,6,7,8]), toUInt32(3), toUInt32(30))) AS res;

#######################
┌─res───────────┐
│ [3,4,5,6,7,8] │
└───────────────┘

是否包含指定元素

bitmapContains(bitmap, x)

包含返回1, 不包含返回0

sql 复制代码
SELECT
  bitmapContains(bitmapBuild([1, 3, 5, 7, 9]), toUInt32(3)) AS res1,
  bitmapContains(bitmapBuild([1, 3, 5, 7, 9]), toUInt32(4)) AS res2;

#######################
┌─res1─┬─res2─┐
│    1 │    0 │
└──────┴──────┘

两个 Bitmap 是否存在相同元素

bitmapHasAny(bitmap1,bitmap2)

存在返回1, 不存在返回0

sql 复制代码
SELECT 
  bitmapHasAny(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) as res1,
  bitmapHasAny(bitmapBuild([1,2,3]), bitmapBuild([4,5])) as res2;

####################
┌─res1─┬─res2─┐
│    1 │    0 │
└──────┴──────┘

一个是否为另一个 Bitmap 的子集

bitmapHasAll(bitmap1,bitmap2)

sql 复制代码
SELECT 
  bitmapHasAll(bitmapBuild([1,2,3]), bitmapBuild([2,3])) as res1,
  bitmapHasAll(bitmapBuild([1,2,3]), bitmapBuild([2,3,4])) as res2,
  bitmapHasAll(bitmapBuild([1,2,3]), bitmapBuild(emptyArrayUInt8())) as res3;

#####################
┌─res1─┬─res2─┬─res3─┐
│    1 │    0 │    1 │
└──────┴──────┴──────┘

求最小值

bitmapMin(bitmap)

数组为空返回0

sql 复制代码
SELECT 
 bitmapMin(bitmapBuild([1,2,3])) as res1,
 bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;

#############
┌─res1─┬─res2─┐
│    1 │   0   │
└──────┴──────┘

求最大值

bitmapMax(bitmap)

数组为空,返回0

sql 复制代码
SELECT 
 bitmapMax(bitmapBuild([1,2,3])) as res1,
 bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;
###################
┌─res1─┬─res2─┐
│    3 │    0 │
└──────┴──────┘

And 求交集

bitmapAnd(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapToArray(bitmapAnd(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
));
#################
┌─bitmapToArray(bitmapAnd(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4])))─┐
│ [2,3]                                                                    │
└──────────────────────────────────────────────────────────────────────────┘

Or 求并集

bitmapOr(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapToArray(bitmapOr(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
));
#################
┌─bitmapToArray(bitmapOr(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4])))─┐
│ [1,2,3,4]                                                               │
└─────────────────────────────────────────────────────────────────────────┘

Andnot 求差集

bitmapAndnot(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapToArray(bitmapAndnot(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
));
#################
┌─bitmapToArray(bitmapAndnot(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4])))─┐
│ [1]                                                                         │
└─────────────────────────────────────────────────────────────────────────────┘

Xor 求并集元素减去交集元素

bitmapXor(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapToArray(bitmapXor(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
));

###################
┌─bitmapToArray(bitmapXor(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4])))─┐
│ [1,4]                                                                    │
└──────────────────────────────────────────────────────────────────────────┘

求交集元素个数

bitmapAndCardinality(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapAndCardinality(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
);

#############
┌─bitmapAndCardinality(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4]))─┐
│                                                                    2 │
└──────────────────────────────────────────────────────────────────────┘

求并集元素个数

bitmapOrCardinality(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapOrCardinality(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
);

##################
┌─bitmapOrCardinality(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4]))─┐
│                                                                   4 │
└─────────────────────────────────────────────────────────────────────┘

求差集元素个数

bitmapAndnotCardinality(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapAndnotCardinality(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
);

##################
┌─bitmapAndnotCardinality(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4]))─┐
│                                                                       1 │
└─────────────────────────────────────────────────────────────────────────┘

求异或元素个数

bitmapXorCardinality(bitmap1,bitmap2)

sql 复制代码
SELECT bitmapXorCardinality(
  bitmapBuild([1,2,3]), bitmapBuild([2,3,4])
);

##################
┌─bitmapXorCardinality(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3, 4]))─┐
│                                                                    2 │
└──────────────────────────────────────────────────────────────────────┘

替换指定范围内的元素

bitmapTransform(bitmap, from_array, to_array)

将Bitmap 中的 [5,999,2] 元素替换为 [2,888,20]

sql 复制代码
SELECT bitmapToArray(
  bitmapTransform(bitmapBuild([1,2,3,4,5,6,7,8,9,10]), [5,999,2], [2,888,20])
) as res;
#############
┌─res───────────────────┐
│ [1,3,4,6,7,8,9,10,20] │
└───────────────────────┘
相关推荐
斯特凡今天也很帅14 小时前
clickhouse常用语句汇总——持续更新中
数据库·sql·clickhouse
SelectDB技术团队2 天前
从 ClickHouse、Druid、Kylin 到 Doris:网易云音乐 PB 级实时分析平台降本增效
大数据·数据仓库·clickhouse·kylin·实时分析
risc1234566 天前
【ClickHouse】RollingBitmap
clickhouse
斯特凡今天也很帅6 天前
clickhouse如何查看操作记录,从日志来查看写入是否成功
数据库·clickhouse
袖清暮雨11 天前
ClickHouse讲解
大数据·数据库·数据仓库·clickhouse·oracle
江枫渔火L13 天前
使用clickhouse的ReplacingMergeTree引擎表做活跃玩家信息表
数据库·clickhouse
潇凝子潇15 天前
Doris ClickHouse Greenplum 对比
clickhouse·doris·greenplum
递归尽头是星辰16 天前
ClickHouse核心优势分析与场景实战
大数据·数据仓库·clickhouse·实时分析·实时查询
鲁尼的小宝贝18 天前
基于Flink的数据中台管理平台
java·大数据·clickhouse·flink·yarn
问道飞鱼22 天前
【大数据知识】今天聊聊Clickhouse部署方案
大数据·clickhouse·部署