【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态
简介:本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB级的数据规模,简单的架构,被国内外公司广泛采用。本系列技术文章,将详细展开介绍 ClickHouse。
前言
本文翻译自 Altinity 针对 ClickHouse 的系列技术文章。面向联机分析处理(OLAP)的开源分析引擎 ClickHouse,因其优良的查询性能,PB 级的数据规模,简单的架构,被国内外公司广泛采用。
阿里云 EMR-OLAP 团队,基于开源 ClickHouse 进行了系列优化,提供了开源 OLAP 分析引擎 ClickHouse 的云上托管服务。EMR ClickHouse 完全兼容开源版本的产品特性,同时提供集群快速部署、集群管理、扩容、缩容和监控告警等云上产品功能,并且在开源的基础上优化了 ClickHouse 的读写性能,提升了 ClickHouse 与 EMR 其他组件快速集成的能力。访问 ClickHouse - E-MapReduce - 阿里云 了解详情。
译者:何源(荆杭),阿里云计算平台事业部高级产品专家
ClickHouse 聚合函数和聚合状态
ClickHouse 可能有一个独特的功能——聚合状态(除了聚合函数外)。你可以参考 和 组合子的文档。
简而言之,许多数据库使用概率数据结构,例如 HyperLogLog(简称 HLL)。它用于唯一/去重计算,你可以在Spark、ElasticSearch、Flink、Postgres、BigQuery 和 Redis 等服务中看到它的效果。但通常你只能在聚合函数中应用此函数一次,例如查询每月唯一用户数——得到一个数字,这样就知足了。由于 HLL 结构没有对应的内部格式,因此无法重用预聚合或部分聚合的数据。而在 ClickHouse 中,你可以这样做,因为 HLL 结构是一致的。
ClickHouse 的速度非常快,其基本思路是处理原始数据而不是预聚合数据。但是让我们做个实验。例如,我们需要为上个月的唯一用户数计算一些指标。
设想:每天预聚合,然后汇总所有结果。这就是所谓的存储空间方法——以后你可以只汇总最后 30 个测量值来计算上个月的统计数据,或者只汇总最后 7 个测量值来计算上周的统计数据。
创建我们的预聚合表:
create table events_unique (
date Date,
group_id String,
client_id String,
event_type String,
product_id String,
value AggregateFunction(uniq, String)
) ENGINE = MergeTree(date, (group_id, client_id, event_type, product_id, date), 8192);
这里将我的聚合声明为 AggregateFunction(uniq, String)。我们关注的是一些独特的指标,这些指标是在 String 列上计算的(为了进一步优化,你可能应该使用 FixedString 或二进制数据)。
让我们将数据插入预聚合表:
INSERT INTO events_unique
SELECT date, group_id, client_id, event_type, product_id, uniqState(visitor_id) AS value
FROM events
GROUP BY date, group_id, client_id, event_type, product_id;
进行冒烟测试,确认其可以正常运行:
SELECT uniqMerge(value) FROM events_unique GROUP BY product_id;
现在让我们比较原始表和预聚合表的查询性能。原始查询:
SELECT uniq(visitor_id) AS c
FROM events
WHERE client_id = ‘aaaaaaaa’
AND event_type = ‘click’
AND product_id = ‘product1’
AND date >= ‘2017–01–20’
AND date < ‘2017–02–20’; ┌──────c─┐
│ 457954 │
└────────┘
1 rows in set. Elapsed: 0.948 sec. Processed 13.22 million rows, 1.61 GB (13.93 million rows/s., 1.70 GB/s.)
预聚合表的结果:
SELECT uniqMerge(value) AS c
FROM events_unique
WHERE client_id = ‘aaaaaaaa’
AND event_type = ‘click’
AND product_id = ‘product1’
AND date >= ‘2017–01–20’
AND date < ‘2017–02–20’; ┌──────c─┐
│ 457954 │
└────────┘
1 rows in set. Elapsed: 0.050 sec. Processed 39.39 thousand rows, 8.55 MB (781.22 thousand rows/s., 169.65 MB/s.)
结果表明,我们的处理时间缩短到 1/20。
在实践中,将物化视图与 AggregatingMergeTree 引擎结合使用,会比使用单独的表更方便。
总结
ClickHouse 可让你将聚合状态存储在数据库中,而不仅仅是存储在业务应用中,这有望带来颇具吸引力的性能优化和新用例。有关更多详细信息,请查看关于 AggregatingMergeTree 引擎的丰富文档。
后续
您已经了解了在 ClickHouse 中处理实时更新相关内容,本系列还包括其他内容:
- 在 ClickHouse 中处理实时更新
- 使用新的 TTL move,将数据存储在合适的地方
- 在 ClickHouse 物化视图中使用 Join
- ClickHouse 聚合函数和聚合状态(本文)
- ClickHouse 中的嵌套数据结构
原文链接
本文为阿里云原创内容,未经允许不得转载。
【ClickHouse 技术系列】- ClickHouse 聚合函数和聚合状态的更多相关文章
- 【SqlServer系列】聚合函数
1 概述 本篇文章简要回顾SQL Server 聚合函数,MAX,MIN,SUM,AVG,SUM,CHECKSUM_EGG,COUNT,STDEV,STDEVP,VAR,VARP. 2 具体 ...
- Sql Server系列:聚合函数
1 SUM SUM是一个求和函数,返回指定列值的总和.SUM 只能用于数字列. 其中忽略 Null 值. 语法 SUM ( [ ALL | DISTINCT ] expression ) OVER ( ...
- ClickHouse源码笔记5:聚合函数的源码再梳理
笔者在源码笔记1之中分析过ClickHouse的聚合函数的实现,但是对于各个接口函数的实际如何共同工作的源码,回头看并没有那么明晰,主要原因是没有结合Aggregator的类来一起分析聚合函数的是如果 ...
- ClickHouse源码笔记1:聚合函数的实现
由于工作的需求,后续笔者工作需要和开源的OLAP数据库ClickHouse打交道.ClickHouse是Yandex在2016年6月15日开源了一个分析型数据库,以强悍的单机处理能力被称道. 笔者在实 ...
- ClickHouse学习系列之三【配置文件说明】
背景 最近花了些时间看了下ClickHouse文档,发现它在OLAP方面表现很优异,而且相对也比较轻量和简单,所以准备入门了解下该数据库系统.在介绍了安装和用户权限管理之后,本文对其配置文件做下相关的 ...
- ClickHouse学习系列之五【系统库system说明】
背景 之前介绍过ClickHouse相关的系列文章,现在ClickHouse已经能正常使用起来了,包括副本和分片.因为ClickHouse已经可以提供服务了,现在需要关心的就是服务期间该数据库的各项性 ...
- ClickHouse学习系列之八【数据导入迁移&同步】
背景 在介绍了一些ClickHouse相关的系列文章之后,大致对ClickHouse有了比较多的了解.它是一款非常优秀的OLAP数据库,为了更好的来展示其强大的OLAP能力,本文将介绍一些快速导入大量 ...
- 微软BI 之SSAS 系列 - 多维数据集中度量值设计时的聚合函数 (累加性_半累加性和非累加性)
在 SSAS 系列 - 实现第一个 Cube 以及角色扮演维度,度量值格式化和计算成员的创建 中主要是通过已存在的维度和事实数据创建了一个多维数据集,并同时解释了 Role-Playing Dimen ...
- SQL Server温故系列(4):SQL 查询之集合运算 & 聚合函数
1.集合运算 1.1.并集运算 UNION 1.2.差集运算 EXCEPT 1.3.交集运算 INTERSECT 1.4.集合运算小结 2.聚合函数 2.1.求行数函数 COUNT 2.2.求和函数 ...
- Spark 系列(十一)—— Spark SQL 聚合函数 Aggregations
一.简单聚合 1.1 数据准备 // 需要导入 spark sql 内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSe ...
随机推荐
- 网络流媒体协议的联系与区别 (RTP RTCP RTSP RTMP HLS)(转)
网络流媒体协议的联系与区别(RTP RTCP RTSP RTMP HLS) RTP RTCP RTSP RTMP HLS 区别与联系 RTP传输流媒体数据.RTCP对RTP进行控制,同步.RTSP发起 ...
- 3、Azure Devops之Azure Repos篇
1.什么是Azure Repos Azure Repos,就是我们常说的代码仓库,相当于gitee,github,git,svn工具.主要是提供给开发人员使用的,管理.查看代码的部件.通过Files. ...
- 03.Android崩溃Crash库之ExceptionHandler分析
目录总结 00.异常处理几个常用api 01.UncaughtExceptionHandler 02.Java线程处理异常分析 03.Android中线程处理异常分析 04.为何使用setDefaul ...
- uni-app如何实现USB插入后自动弹出对应软件
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近碰到了一个奇葩需求,要用uni-app来实现usb接入设备的时候,让软件自动弹出来,这里给出我制作的过程和参考的各种思路,希望对大家有 ...
- vue中类tabs左右滑动
效果图 思路 给定一个变量用来记录滚动了几列,每滚动一次加1滚动一列,监听页面滚动父级元素宽度改变,重新设置滚动的距离(放在计算属性中让其自动计算) <template> <div ...
- #状压dp,拓扑排序,内向基环树#CF1242C Sum Balance
题目 有 \(k\) 个盒子, 第 \(i\) 个盒子有 \(n_i\) 个数. 保证所有数互不相同. 从每个盒子各拿出一个数, 并按照某种顺序放回去(每个盒子恰好放入一个数). 判断是否能使操作后所 ...
- 使用谷歌浏览器打开PDF文件,怎么关闭缩略图
我们在使用谷歌浏览器浏览PDF文件时,总是会出现章节预览缩略图和工具栏,我们可以使用 参数来控制浏览器不显示出工具栏 #scrollbars=0&toolbar=0&statusbar ...
- openGauss/MogDB 学习笔记之 -- PITR恢复
openGauss/MogDB 学习笔记之 -- PITR 恢复 概念描述 背景信息 当数据库崩溃或希望回退到数据库之前的某一状态时,MogDB 的即时恢复功能(Point-In-Time Recov ...
- 掌握 xUnit 单元测试中的 Mock 与 Stub 实战
引言 上一章节介绍了 TDD 的三大法则,今天我们讲一下在单元测试中模拟对象的使用. Fake Fake - Fake 是一个通用术语,可用于描述 stub或 mock 对象. 它是 stub 还是 ...
- spring boot 手动value和自动注入配置的区别[五]
前言 前面两篇中,写道我们注入配置的方式,是通过是注解的方式完成,如下: @ConfigurationProperties(prefix ="person") 这意味着: 我们写一 ...