clickhouse中bitmap的使用对于用户标签及用户,访客跨维度去重统计是十分合适的选择,具有更快的查询效率。

1.bitmap

bitmap建表方式:

create table test.bitmap_test(tenant_id   String  comment '租户id',shop_id     String  comment '门店id',h           int    comment '小时段',uv          AggregateFunction(groupBitmap(),Int64) comment '记录访客人数',dt          Date   comment '日期'
)engine =AggregatingMergeTree()
partition by (dt)
order by (tenant_id,shop_id)
settings index_granularity =8192;

uv字段就是bitmap的数据类型,里面存储的元素就是bitmap对象

创建数据源表:

create table test.bitmap_source(tenant_id   String  comment '租户id',shop_id     String  comment '门店id',h           int    comment '小时段',uv          String comment '记录访客人数',dt          Date   comment '日期'
)engine =MergeTree()
partition by (dt)
order by (tenant_id,shop_id)
settings index_granularity =8192;

将数据源表中的数据写入bitmap表中:

    insert into test.bitmap_testselecttenant_id,shop_id,h,groupBitmapState(metroHash64(uv)),dtfrom test.bitmap_test1group by tenant_id, shop_id, h, dt;

其中在将数据写入bitmap表中,使用两个函数metroHash64()将uv String类型的转换为int类型,而后在使用groupBitmapState()函数转换为bitmap对象存入bitmap表中。

通常在bitmap函数后加State则构造为bitmap对象数据,对于构造bitmap有两种方式:

一种是从聚合函数groupBitmapState构造的,另外一种就是使用Array对象进行构建
//构建bitmap函数
SELECT bitmapOrCardinality(bitmapBuild([1,2,3,4,5,6]), bitmapBuild([3,4,5,6,7,8]));

求取去重的uv访客量:

select groupBitmapOr(uv) from test.bitmap_test;

groupBitmap函数就是bitmap对象的聚合函数,作用就是去重统计该bitmap字段对象的的数量。

更多的bitmap聚合函数可以通过下面链接在官网中查看。

2.常用的位图函数

除了上面所说到的聚合函数外,还用很多常用的位图操作函数,对于位图操作函数,可以在下面参考文章和官网资料中有详细的介绍就不在一一解释了。

3.bitmap表join求取去重效果

select * from
(select * from test.bitmap_test t1
left join (select * from test.bitmap_test where tenant_id='1000000007') t2
on t1.tenant_id=t2.tenant_id);

 执行结果:

对于t2中没有关联上的数据,uv直接为空,在使用bitmap聚合函数求取uv的去重人数时候,


select groupBitmapOr(t2.uv) from
(select * from test.bitmap_test t1
left join (select * from test.bitmap_test where tenant_id='1000000007') t2
on t1.tenant_id=t2.tenant_id);

执行结果为:

该结果和下面语句的执行结果相同

select groupBitmapOr(uv) from test.bitmap_test where tenant_id='1000000007';

         这表示用bitmap聚合函数求取去重人数的时候字段中有空值并不会造成结果的不准确。

4.clickhouse建表时候null值字段设置

建表时如果没有对字段指定可以存储null值,则在数据时候会对null值数据数值类型补为:0,字符串类型补为:''空字符串;

create table if not exists test(id int,name String
)
engine =MergeTree()
order by (id);--没有对字段设置为可支持null值存储,则保存时候会无法存入null值,对null数据替换

解决方案:clickhouse支持null值存储语法

create table if not exists test(id Nullable(int),name Nullable(String)
)
engine =MergeTree()
order by (id);--使用nullable语法来实现支持null值

官网资料:

1.bitmap建表数据类型指定

2.bitmap的聚合函数

3.位图操作函数

参考文章:

1.BitMap使用在clickhouse中

2.参考

clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理相关推荐

  1. instanceof运算符_Java 8中的instanceof运算符和访客模式替换

    instanceof运算符 我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTy ...

  2. Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长. 所以我想出了以下DSL语法: Object msg = //...whenTypeOf(msg).is(D ...

  3. oracle无效的关系运算符_每日一课 | Java 8中的instanceof运算符和访客模式替换

    我有一个梦想,不再需要操作员和垂头丧气的instanceof ,却没有访客模式的笨拙和冗长.所以我想出了以下DSL语法: Object msg = //... whenTypeOf(msg).     ...

  4. java 访客模式,每日一课 | Java 8中的instanceof运算符和访客模式替换

    每日一课 | Java 8中的instanceof运算符和访客模式替换 每日一课 | Java 8中的instanceof运算符和访客模式替换 我有一个梦想,不再需要操作员和垂头丧气的instance ...

  5. 【Office 365】Guest用户(访客)访问并操作SharePoint online站点

    在工作中遇到了一个场景,外部用户(访客)如何访问SharePoint online的信息,以及如何对SharePoint站点进行操作 下面一起来操作一下吧,let's go(如有问题请大家及时指出,多 ...

  6. java网页统计访客量_Java中的访客设计模式

    java网页统计访客量 Visitor Design Pattern is one of the behavioral design pattern. 访客设计模式是行为设计​​模式之一. 访客设计模 ...

  7. win7计算机管理中没有本地用户,Win7旗舰版系统计算机管理中没有本地用户和组解决方法...

    本地用户和组功能位于计算机管理中,平常我们会使用本地用户和组来分配本地用户帐户或组帐户的权限和权利,一般情况下我们会通过桌面"计算机"图标右键"管理"来打开&q ...

  8. win7计算机管理中没有本地用户,帮你win7系统计算机管理中没有本地用户和组的设置教程...

    我们在使用电脑工作的时候,不可避免会遇到一些win7系统计算机管理中没有本地用户和组的状况,如今就有用户反映在使用电脑的时候遇到win7系统计算机管理中没有本地用户和组的情况不知怎么解决,针对这个问题 ...

  9. Oracle数据库 登录命令 用户管理 建表 修改字段 数据类型 约束 增删改查

    什么是数据库? 存储数据的仓库 优点: 1.可存储大量数据 2.方便检索 3.保持数据的一致性.完整性 4.安全,可共享 解决的问题? 数据的持久化(把数据写到磁盘中) 安装看安装文档: 口令管理: ...

最新文章

  1. App开发流程之右滑返回手势功能续
  2. 《编程珠玑(第2版•修订版)》—第2章2.5节原理
  3. SQL语句错误:Operand should contain 1 column(s)【查询多个字段不用加括号】
  4. 分析jQuery源码时记录的一点感悟
  5. 【C#/.NET】.NET6中全局异常处理
  6. Python 命令行库的大乱
  7. Android 系统(188)---Android开发:ListView、AdapterView、RecyclerView全面解析
  8. mongodb windows的安装方法和添加到任务管理器中、检测是否成功、增删改查命令...
  9. awk '/#BEGIN/,/#END/{next}1' 1是什么意思?-转
  10. 【李宏毅2020 ML/DL】补充:Meta Learning - Metric-based Approach Train+Test as RNN
  11. NVT NT98510 SDK介绍
  12. 【蓝牙sbc协议】sbc源码阅读笔记(二)——sbc_struct详解(下)
  13. 什么是SEM竞价推广,竞价排名有何特征?
  14. php动态执行生成条码,PHP生成条形码 之二 开源之道
  15. Quartus (Quartus Prime 18.1)的安装及仿真步骤
  16. [转]Top Five Ways SpiderLabs Got Domain Admin on Your Internal Network
  17. 男人最渴望拥有的十类妻子
  18. BUG:索引字段超长-Specified key was too long; max key length is 767 bytes
  19. PB 打印机打印横纵向设置
  20. Python爬取大乐透

热门文章

  1. python中文意思是什么-python是什么意思中文翻译
  2. 2022-2028全球与中国健康资讯交换(HIE)市场现状及未来发展趋势
  3. BLDC无刷电机驱动板,foc驱动板,有霍尔接口,反电动势接口,三相电流采集接口
  4. 【因缘际会】知乎APP的简单的产品体验报告
  5. Dev Express Report 动态表头设置
  6. Android开发app实现发送短信功能
  7. 计算机系统怎么装到u盘启动不了,电脑开机就进入BIOS界面,设置了u盘启动准备从装系统但是进不了U盘,这些是为什么啊?...
  8. 宁海中考政策计算机考试合格,宁海中考指南!同学们、家长们你们准备好了吗?...
  9. C语言赋值被截断,c语言中赋值截断
  10. 松香的用法(电烙铁焊接)