当前位置: 首页 > news >正文

Clickhouse中bitmap使用指南(ck位图)

clickhouse在20以后的版本支持数据列为64位的压缩位图

内部实际类型为Roaring64NavigableMap,具体可参考https://github.com/RoaringBitmap/CRoaring

1、如何建表

只需要设置列的类型为 AggregateFunction(groupBitmap,UInt64) 即可

例:

CREATE TABLE test.bitmapdemp
(
bit AggregateFunction(groupBitmap,
UInt64)
)
...

2、数据如何写入

通常是明细表进行转换,通过groupBitmapState对某offset字段进行分组合并

groupBitmapState(offset) AS bit
3、位图之间是否可以进行计算

位图之间可以进行与或非等计算,具体可参考官方文档

4、位图与明细表进行join

也就是要从明细表中查出offset 在该位图里的明细数据

SELECT offset FROM 明细表 WHERE offset IN (SELECT bitmapToArray(bit) FROM 位图表 WHERE ...)

5、位图数据导出

把位图转成一张虚拟表的一列来通过ResultSet读出

SELECT arr AS offset FROM (SELECT bitmapToArray(bit) as arr FROM 位图表 WHERE ... LIMIT 1) ARRAY JOIN arr

6、如何把位图写入ck

String sql = "INSERT INTO bitmap.crowd(crowd_code, crowd_version, offset_bitmap) VALUES(?, ?, ?)";try{pstmt = conn.prepareStatement(sql);pstmt.setString(1, crowdCode);pstmt.setString(2, version);Roaring64NavigableMap bitmap = new Roaring64NavigableMap();bitmap.add(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16);ClickHouseBitmap wrap = ClickHouseBitmap.wrap(bitmap, ClickHouseDataType.UInt64);pstmt.setObject(3, wrap);pstmt.execute();}catch (Exception e){e.printStackTrace();}

7、查询分布式表里的bitmap,合并成一个数组

SELECT COUNT(arrayJoin(bitmapToArray(offset_bitmap))) AS arr FROM test.bitmap_dist PREWHERE xxx;

8、从详情表查询数据构建成一个bitmap

SELECT bitmapBuild(groupArray(offset)) AS bitmap FROM ...

测试发现
SELECT bitmapBuild(groupArray(offset)) 改成SELECTbitmapBuild(groupArrayDistinct(offset)) 性能提高非常显著



作者:和平菌
链接:https://www.jianshu.com/p/cfb2de57f161
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://www.mrgr.cn/news/6208.html

相关文章:

  • 【QT从入门helloworld到进阶QT(C++)部署YOLOV5】
  • redis 主从复制方案
  • Python酷库之旅-第三方库Pandas(094)
  • Ollama - Llama3 docker版本安装部署使用
  • 物联网(IoT)设备渗透文章二:智能家居中控系统的渗透与利用
  • clickhouse中使用ReplicatedMergeTree表引擎数据去重问题
  • POSIX线程库
  • 详解MBR分区结构以及GPT分区结构
  • 【Vue】生命周期函数
  • 推荐系统三十六式学习笔记:产品篇36 | 组建推荐团队及工程师的学习路径
  • flutter事件与消息通知
  • 零成本搭建个人 APP 和小程序后台
  • 文字滚动通知功能实现 vue 组件
  • 反射型XSS
  • 【微服务】Nacos配置中心和客户端数据同步模式
  • 【Hot100】LeetCode—94. 二叉树的中序遍历
  • 什么是Redis大key问题?如何解决?
  • mpv播放器在rk3399上配置硬解码
  • 【Windows】深度学习环境部署
  • 【Linux操作系统】进程间通信(1)