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
输出如下:
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─┐
│ 1 │ 0 │
└──────┴──────┘
两个 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─┐
│ 1 │ 0 │
└──────┴──────┘
一个是否为另一个 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─┐
│ 1 │ 0 │ 1 │
└──────┴──────┴──────┘
求最小值
bitmapMin(bitmap)
数组为空返回0
SELECT bitmapMin(bitmapBuild([1,2,3])) as res1,bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;#############
┌─res1─┬─res2─┐
│ 1 │ 0 │
└──────┴──────┘
求最大值
bitmapMax(bitmap)
数组为空,返回0
SELECT bitmapMax(bitmapBuild([1,2,3])) as res1,bitmapMin(bitmapBuild(emptyArrayUInt8())) as res2;
###################
┌─res1─┬─res2─┐
│ 3 │ 0 │
└──────┴──────┘
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 提示错误: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集合工具类、泛型
"我已不在地坛,地坛在我" —— 《想念地坛》 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 值; 产生 FA 的条件: 1、5类LSA ----假设 R2为 ASBR,90/0 口工作的 OSPF 中,g0/1 口工作在非 ospf 协议或不同 ospf 进程中;若 g0/1 也同时宣告在和 g0/0 相同的 OSPF 进程…...

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

这些项目,我当初但凡参与一个,现在也不至于还是个程序员
10年前,我刚开始干开发不久,我觉得这真是一个有前景的职业,我觉得我的未来会无限广阔,我觉得再过几年,我一定工资不菲。于是我开始像很多大佬说的那样,开始制定职业规划,并且坚决执行。但过去这…...

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 完美终结版 请访问原文链接:Red Hat Enterprise Linux (RHEL) 8.10 (x86_64, aarch64) - 红帽企业 Linux,查看最新版。原创作品,转载请保留出处…...

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

HTML <from>表单
定义:<form>元素定义了一个表单,用户可以在表单中输入数据,这些数据可以被提交到服务器。 属性: action:指定表单提交时的目标URL(服务器端脚本的地址)。 method:定义提交表…...

Wpf 使用 Prism 实战开发Day28
首页汇总方块点击导航功能 点击首页汇总方块的时候,跳转到对应的数据页面 step1: 在IndexViewModel 中,给TaskBar 里面Target 属性,赋上要跳转的页面 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中一个非常好用的 中文分词组件,但它并不是只有分词这一个功能,还提供了很多在分词之上的算法,如关键词提取、词性标注等。 安装方式: pip install jieba2. 分词 支持 3 种分词模式:精确模式…...

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

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

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

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

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框架中的一个功能强大的方法,它允许你以异步的方式调用QObject派生类的成员函数。这个功能特别有用,因为它允许你安全地在不同的线程之间调用方法,而不需要担心线程…...

2024-05-29 精神分析-孤独感-分析
摘要: 所谓的孤独感是种很笼统的感觉,可能包含了很多种不同的情绪。 比如,希望和他人建立联系,消除敌意,对他人愧疚,想要从他人那里获取关爱或者其他,也可能是感觉到自己的脆弱和无助,希望获得…...

开源与闭源AI模型的对决:数据隐私、商业应用与社区参与
引言 在人工智能(AI)领域,模型的发展路径主要分为“开源”和“闭源”两条。这两种模型在数据隐私保护、商业应用以及社区参与与合作方面各有优劣,是创业公司、技术巨头和开发者们必须仔细权衡的重要选择。那么,面对这些…...

[C语言]自定义类型详解:结构体、联合体、枚举
目录 🚀结构体 🔥结构体类型的声明 🔥结构的自引用 🔥结构体变量的定义和初始化 🔥结构体内存对齐 🔥结构体传参 🔥结构体实现位段(位段的填充&可移植性) &a…...

Vue3使用Composition API实现响应式
title: Vue3使用Composition API实现响应式 date: 2024/5/29 下午8:10:24 updated: 2024/5/29 下午8:10:24 categories: 前端开发 tags: Vue3CompositionRefsReactiveWatchLifecycleDebugging 1. 介绍 Composition API是Vue.js 3中新增的一组API,用于在组件中组…...

使用moquette mqtt发布wss服务
文章目录 概要一、制作的ssl证书二、配置wss小结 概要 moquette是一款不错的开源mqtt中间件,github地址:https://github.com/moquette-io/moquette。我们在发布mqtt服务的同时,是可以提供websocket服务器的,有些场景下需要用到&a…...

【笔记】软件架构师要点记录(2)
【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景,对用到的专业术语进行整理,方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…...

56.野指针和悬空指针
一.野指针 野指针指的是指针指向的地址是未知的(随机的,不正确的地址)。 二.野指针出现的几种情况 1.定义指针未初始化 #include <stdio.h>int main(void) {int *p;*p 1;printf("*p is %d\n",*p); } 正确写法࿱…...

echarts-dataset,graphic,dataZoom, toolbox
dataset数据集配置数据 dataset数据集,也可以完成数据的映射,一般用于一段数据画多个图表 例子: options {tooltip: {},dataset: {source: [["product", "2015", "2016", "2017"],["test&q…...

AI界的“拼夕夕”登场,为上万张GPU寻找新使命
在AI领域,一个全新的竞争者已经悄然登场。 AI行业果真有着近乎颠覆性的魅力! 此次事件之后,AI界也许会迎来新一轮的血雨腥风! AI的潮流到底会怎样流转,天知道。 幻方量化,这家以量化投资闻名的公司&…...

STM32-13-MPU
STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 文章目录 STM32-12-MPU1. 内存保护单元MPU1. M…...