本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 chaodev 即可关注。
前文回顾:
《手摸手带你学ClickHouse》之安装部署
《手摸手带你学ClickHouse》之访问接口
《手摸手带你学ClickHouse》之导入导出数据
《手摸手带你学ClickHouse》之MergeTree系列表引擎
《手摸手带你学ClickHouse》之ReplacingMergeTree表引擎
《手摸手带你学ClickHouse》之CollapsingMergeTree表引擎
《手摸手带你学ClickHouse》之VersionedCollapsingMergeTree表引擎
《手摸手带你学ClickHouse》之SummingMergeTree表引擎
AggregatingMergeTree 和 SummingMergeTree 原理类似,都是对数据进行聚合操作,不同的是,这个可以针对某个字段使用某种聚合函数。例如
CREATE TABLE tb_aggregating(
id Int8,
city String,
v1 AggregateFunction(uniq,String),
v2 AggregateFunction(sum,UInt32),
v3 AggregateFunction(avg,Float64),
create_time DateTime
)ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(create_time)
PRIMARY KEY id
ORDER BY (id,city);
ORDER BY(id,city) 除了排序之外,还表示字段 id 和 city 是聚合条件,等同于 GROUP BY id,city。
v1、v2 和 v3 是聚合字段,等同于 UNIQ(v1),SUM(v2),AVG(v3)。
插入数据时比较特殊
insert into tb_aggregating
select 1,'km',uniqState('test1'),sumState(toUInt32(80)),avgState(toFloat64(100)),now();
insert into tb_aggregating
select 1,'km',uniqState('test1'),sumState(toUInt32(30)),avgState(toFloat64(90.81)),now();
insert into tb_aggregating
select 3,'km',uniqState('test2'),sumState(toUInt32(50)),avgState(toFloat64(60)),now();
insert into tb_aggregating
select 3,'bj',uniqState('test3'),sumState(toUInt32(200)),avgState(toFloat64(70.99)),'2021-07-02 17:02:12';
合并分区后,查询数据,但是这里查询数据也有所不同。也需要调用与 uniq、sum、avg 对应的 uniqMerge、sumMerge、avgMerge 函数。
select id,city,uniqMerge(v1),sumMerge(v2),avgMerge(v3) from tb_aggregating
GROUP BY id,city;
这个引擎的主流用法是结合物化视图使用,并将物化视图的表引擎指定为 AggregatingMergeTree。
啥意思呢,请看下图所示:
通常会使用一张底表来存储全量的明细数据,提供实时查询,然后数据会自动同步到物化视图,物化视图按照 AggregatingMergeTree 引擎规则处理,这样物化视图存储了聚合数据,查询时从物化视图查询即可。
首先,建立底表
CREATE TABLE tb_agg_basic(
id Int8,
city String,
v1 UInt32,
v2 Float64
)ENGINE=MergeTree()
PARTITION BY city
PRIMARY KEY id
ORDER BY (id,city);
建立物化视图
CREATE MATERIALIZED VIEW view_agg
ENGINE=AggregatingMergeTree()
PARTITION BY city
ORDER BY (id,city)
AS
SELECT id,city,sumState(v1) v1,avgState(v2) v2
FROM tb_agg_basic
GROUP BY id,city;
向底表插入数据
insert into tb_agg_basic
values
(1,'km',80,100),
(1,'km',30,90),
(2,'km',50,60),
(3,'bj',200,70.99),
(3,'bj',10,30);
select id,city,sumMerge(v1),avgMerge(v2) from view_agg
GROUP BY id,city;
后续将继续更新该系列,大佬超手摸手带你学ClickHouse,敬请关注!!!
觉得有帮助点个赞吧!!!
原创不易,转载请注明出处。
微信扫一扫下方二维码即可关注我的公众号