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)) 改成SELECT
          bitmapBuild(groupArrayDistinct(offset)) 性能提高非常显著

你可能感兴趣的:(Clickhouse中bitmap使用指南(ck位图))