上文《ClickHouse基础系列(十二)ClickHouse表引擎之MergeTree系列SummingMergeTree引擎》我们介绍了求和的表引擎,本文我们介绍AggregatingMergeTree引擎。
AggregatingMergeTree表引擎主要是可以指定哪些字段做如何的聚合,他可以实现SummingMergeTree表引擎的效果,但是他的功能会比SummingMergeTree功能更强大。
目前AggregatingMergeTree表引擎主要应用在2个领域,分别是table表和物化视图里面。在实际的工作中应用到物化视图的频率会更高一点。但是这里我们都介绍下两种方式。
1)应用于table表中
这里应用于table表的时候,需要涉及到3个方面的操作,分别是:
1、创建表的时候,在指定的字段上添加AggregateFunction类型操作函数。 2、在写入数据的时候需要指定*-State 函数 3、在查询数据的时候需要指定*-Merge 函数
这3个方面的操作为1和2搭配,1和3搭配,两者必须同时满足。下面我们来演示一下:
#创建pageviews表,这里我们在pv上面指定AggregateFunction,具体的操作是求和--sum函数 CREATE TABLE if not exists test.pageviews( uid UInt8, ugroup UInt8, pv AggregateFunction(sum,UInt32) ) ENGINE = AggregatingMergeTree() PARTITION BY ugroup primary key uid ORDER BY uid; #插入数据,这里插入数据的时候一定要使用*-state函数,然后里面把值转换成int或者decimal等类型 insert into test.pageviews select 1,1,sumState(toInt32(1)); insert into test.pageviews select 1,1,sumState(toInt32(1)); insert into test.pageviews select 1,1,sumState(toInt32(1)); insert into test.pageviews select 2,1,sumState(toInt32(1)); #查询数据,需要使用*-merge,并且指定group by字段 select uid,ugroup,sumMerge(pv) from test.pageviews GROUP by uid,ugroup;
最后我们看看运行效果:
可以看到数据已经被聚合出来了。
2)应用于物化视图中
如果要把AggregatingMergeTree表引擎应用于物化视图中的话,一般会涉及到与其他模型的表进行搭配使用,例如我们这里使用MergeTree表引擎+AggregationgMergeTree引擎的物化视图案例。
#创建一张pageview的mergetree的表引擎 CREATE TABLE if not exists test.pageview( uid UInt8, ugroup UInt8, pv UInt8 ) ENGINE = MergeTree() PARTITION BY ugroup primary key uid ORDER BY uid; #创建一张pageview_report的AggregationgMergeTree引擎的物化视图 create materialized view test.pageview_report engine = AggregatingMergeTree() order by uid as select uid,ugroup,sumState(pv) as pvs from test.pageview group by uid,ugroup; #向pageview插入数据 insert into test.pageview values(1,1,1); insert into test.pageview values(1,1,1); insert into test.pageview values(1,1,1); insert into test.pageview values(2,1,1); insert into test.pageview values(1,1,1); insert into test.pageview values(1,1,1); insert into test.pageview values(2,1,1); #查询pageview_report的物化视图 select uid,ugroup,sumMerge(pvs) from test.pageview_report group by uid,ugroup;
最后查询出来的效果是:
数据也是完全没问题的。
备注:
1、使用AggregatingMergeTree表引擎在在创建表的时候一定要注意添加对应的fun函数。 2、使用AggregatingMergeTree表引擎的话尽量使用物化视图,因为这样可以避免多存储一份pageview这种表的数据,减少存储成本和程序的逻辑复杂性。
还没有评论,来说两句吧...