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

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

文章目录

    • 创建 Bitmap 对象
    • Bitmap 转换为整数数组
    • 计算总数(去重)值
    • 指定start, end 索引生成子 Bitmap
    • 指定 start 索引和数量限制生成子 Bitmap
    • 指定偏移量生成子 Bitmap
    • 是否包含指定元素
    • 两个 Bitmap 是否存在相同元素
    • 一个是否为另一个 Bitmap 的子集
    • 求最小值
    • 求最大值
    • And 求交集
    • Or 求并集
    • Andnot 求差集
    • Xor 求并集元素减去交集元素
    • 求交集元素个数
    • 求并集元素个数
    • 求差集元素个数
    • 求异或元素个数
    • 替换指定范围内的元素

Bitmap 类型说明

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

创建 Bitmap 对象

它有两种构造方法:

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

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

    SELECT groupBitmapState(UserID) AS res
    FROM hits_v1
    where UserID IN ()
    

    快速求去重后的数量:

    # 等价于 count(distinct(UserID))
    SELECT groupBitmap(UserID) AS res FROM hits_v1
    

    输出如下:
    image.png

Bitmap 转换为整数数组

bitmapBuild(array)

select bitmapBuild([1,2,3]) AS res, bitmapToArray(res) AS arr;################
┌─res─┬─arr─────┐
│     │ [1,2,3] │
└─────┴─────────┘

计算总数(去重)值

bitmapCardinality(bitmap)
数组中的元素为 Uint64 类型的

SELECT bitmapCardinality(bitmapBuild([1,2,3,4,5,5,5])) AS res;#################
┌─res─┐
│   5 │
└─────┘

指定start, end 索引生成子 Bitmap

bitmapSubsetInRange(bitmap, range_start, range_end)

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)

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开始

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

SELECTbitmapContains(bitmapBuild([1, 3, 5, 7, 9]), toUInt32(3)) AS res1,bitmapContains(bitmapBuild([1, 3, 5, 7, 9]), toUInt32(4)) AS res2;#######################
┌─res1─┬─res2─┐
│    10 │
└──────┴──────┘

两个 Bitmap 是否存在相同元素

bitmapHasAny(bitmap1,bitmap2)
存在返回1, 不存在返回0

SELECT bitmapHasAny(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) as res1,bitmapHasAny(bitmapBuild([1,2,3]), bitmapBuild([4,5])) as res2;####################
┌─res1─┬─res2─┐
│    10 │
└──────┴──────┘

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

bitmapHasAll(bitmap1,bitmap2)

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─┐
│    101 │
└──────┴──────┴──────┘

求最小值

bitmapMin(bitmap)
数组为空返回0

SELECT bitmapMin(bitmapBuild([1,2,3])) as res1,bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;#############
┌─res1─┬─res2─┐
│    10   │
└──────┴──────┘

求最大值

bitmapMax(bitmap)
数组为空,返回0

SELECT bitmapMax(bitmapBuild([1,2,3])) as res1,bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;
###################
┌─res1─┬─res2─┐
│    30 │
└──────┴──────┘

And 求交集

bitmapAnd(bitmap1,bitmap2)

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)

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)

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)

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)

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

求并集元素个数

bitmapOrCardinality(bitmap1,bitmap2)

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

求差集元素个数

bitmapAndnotCardinality(bitmap1,bitmap2)

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

求异或元素个数

bitmapXorCardinality(bitmap1,bitmap2)

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]

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] │
└───────────────────────┘

相关文章:

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

文章目录 创建 Bitmap 对象Bitmap 转换为整数数组计算总数(去重)值指定start, end 索引生成子 Bitmap指定 start 索引和数量限制生成子 Bitmap指定偏移量生成子 Bitmap是否包含指定元素两个 Bitmap 是否存在相同元素一个是否为另一个 Bitmap 的子集求最小…...

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量,一切的好事都应该有权利发生

202474读书笔记|《我自我的田渠归来》——愿你拥有向上的力量 《我自我的田渠归来》作者张晓风,被称为华语散文温柔的一支笔,她的短文很有味道,角度奇特,温柔慈悲而敏锐。 很幸运遇到了这本书,以她的感受重新认识一些事…...

SheetJS V0.17.5 导入 Excel 异常修复 Invalid HTML:could not find<table>

导入 Excel 提示错误&#xff1a;Invalid HTML:could not find<table> 检查源代码 发现 table 属性有回车符 Overview: https://docs.sheetjs.com/docs/ Source: https://git.sheetjs.com/sheetjs/sheetjs/issues The public-facing websites of SheetJS: sheetjs.com…...

重学java51.Collections集合工具类、泛型

"我已不在地坛&#xff0c;地坛在我" —— 《想念地坛》 24.5.28 一、Collections集合工具类 1.概述:集合工具类 2.特点: a.构造私有 b.方法都是静态的 3.使用:类名直接调用 4.方法: static <T> boolean addAll(collection<? super T>c,T... el…...

OSPF扩展知识2

FA-转发地址 正常 OSPF 区域收到的 5 类 LSA 不存在 FA 值&#xff1b; 产生 FA 的条件: 1、5类LSA ----假设 R2为 ASBR&#xff0c;90/0 口工作的 OSPF 中&#xff0c;g0/1 口工作在非 ospf 协议或不同 ospf 进程中&#xff1b;若 g0/1 也同时宣告在和 g0/0 相同的 OSPF 进程…...

数据库技术基础

数据库技术基础 导航 文章目录 数据库技术基础导航一、基础概念数据库系统数据库管理系统DBMS分类数据库技术的发展数据库体系结构 二、数据模型数据模型基本概念 三、数据库的控制功能事务概述SOL中事务定义语句日志文件故障种类两个操作Undo/Redo事务故障的恢复系统故障的恢…...

这些项目,我当初但凡参与一个,现在也不至于还是个程序员

10年前&#xff0c;我刚开始干开发不久&#xff0c;我觉得这真是一个有前景的职业&#xff0c;我觉得我的未来会无限广阔&#xff0c;我觉得再过几年&#xff0c;我一定工资不菲。于是我开始像很多大佬说的那样&#xff0c;开始制定职业规划&#xff0c;并且坚决执行。但过去这…...

ch2应用层--计算机网络期末复习

2.1应用层协议原理 网络应用程序位于应用层 开发网络应用程序: 写出能够在不同的端系统上通过网络彼此通信的程序 2.1.1网络应用程序体系结构分类: 客户机/服务器结构 服务器: 总是打开(always-on)具有固定的、众所周知的IP地址 主机群集常被用于创建强大的虚拟服务器 客…...

Red Hat Enterprise Linux (RHEL) 8.10 发布 - 红帽企业 Linux 8 完美终结版

Red Hat Enterprise Linux (RHEL) 8.10 (x86_64, aarch64) - 红帽企业 Linux 红帽企业 Linux 8 完美终结版 请访问原文链接&#xff1a;Red Hat Enterprise Linux (RHEL) 8.10 (x86_64, aarch64) - 红帽企业 Linux&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处…...

.NET 直连SAP HANA数据库

前言 上个项目碰到的需求&#xff0c;IT部门要求直连SAP的HANA数据库&#xff0c;以只读的权限读取SAP部门开发的CDS视图&#xff0c;是个有点复杂的工程&#xff0c;需要从成品一直往前追溯到原材料的产地&#xff0c;和交货单、工单、采购订单有相当程度上的关联 IT部门要求…...

HTML <from>表单

定义&#xff1a;<form>元素定义了一个表单&#xff0c;用户可以在表单中输入数据&#xff0c;这些数据可以被提交到服务器。 属性&#xff1a; action&#xff1a;指定表单提交时的目标URL&#xff08;服务器端脚本的地址&#xff09;。 method&#xff1a;定义提交表…...

Wpf 使用 Prism 实战开发Day28

首页汇总方块点击导航功能 点击首页汇总方块的时候&#xff0c;跳转到对应的数据页面 step1: 在IndexViewModel 中&#xff0c;给TaskBar 里面Target 属性&#xff0c;赋上要跳转的页面 step2: 创建导航事件命令和方法实现 step3: 实现导航的逻辑。通过取到 IRegionManager 的…...

如何让一个普通用户可以读写某个目录

循环设置这个目录以及上面每一级目录的读取和执行权限 sudo chmod -R orx /opt/software/yourdir 然后设置指定用户user1可以读写这个目录 sudo setfacl -Rm u:user1:rwx /opt/software/yourdir 读取acl sudo getfacl -R /opt/software/yourdir -R 是循环读取子目录和文件的意思…...

知识笔记——jieba分词初探

1. 简介 jieba 是python中一个非常好用的 中文分词组件&#xff0c;但它并不是只有分词这一个功能&#xff0c;还提供了很多在分词之上的算法&#xff0c;如关键词提取、词性标注等。 安装方式&#xff1a; pip install jieba2. 分词 支持 3 种分词模式&#xff1a;精确模式…...

GPT-4o:人工智能新纪元的开端

引言 近年来&#xff0c;人工智能领域的发展日新月异&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;各种生成预训练模型不断推陈出新。自OpenAI发布GPT-3以来&#xff0c;生成预训练模型在文本生成、语言理解等任务中展现了强大的能力。近期&a…...

探索AI去衣技术中的反射应用

在当今数字时代&#xff0c;人工智能&#xff08;AI&#xff09;技术的飞速发展已经渗透到了我们生活的方方面面。其中&#xff0c;图像处理和计算机视觉作为AI的重要分支&#xff0c;正不断推动着创新应用的边界。今天&#xff0c;我们要探讨的是一个颇具争议但又技术上颇为有…...

一款高级管理控制面板主题!【送源码】

AdminLTE是一个完全响应的管理模板。基于Bootstrap5框架和JavaScript插件。高度可定制&#xff0c;易于使用。适用于从小型移动设备到大型桌面的多种屏幕分辨率。AdminLTE 是一个基于Bootstrap 3.x的免费高级管理控制面板主题。 https://github.com/almasaeed2010/AdminLTE —…...

​用 ONLYOFFICE 宏帮你自动执行任务:介绍与教程

使用 ONLYOFFICE 宏&#xff0c;可以来自动实现一些操作节省更多时间和精力。在本文中&#xff0c;我们集合了一些关于宏的教程&#xff0c;带您了解宏的工作原理&#xff0c;以及一些实例展示。 什么是 ONLYOFFICE 宏 如果您是一名资深 Microsoft Excel 用户&#xff0c;那么…...

C++ vector类

目录 0.前言 1.vector介绍 2.vector使用 2.1 构造函数(Constructor) 2.1.1. 默认构造函数 (Default Constructor) 2.1.2 填充构造函数 (Fill Constructor) 2.1.3 范围构造函数 (Range Constructor) 2.1.4 拷贝构造函数 (Copy Constructor) 2.2 迭代器(Iterator) 2.2.…...

QMetaObject::invokeMethod 简介

1. QMetaObject::invokeMethod的功能和用途 QMetaObject::invokeMethod是Qt框架中的一个功能强大的方法&#xff0c;它允许你以异步的方式调用QObject派生类的成员函数。这个功能特别有用&#xff0c;因为它允许你安全地在不同的线程之间调用方法&#xff0c;而不需要担心线程…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...