00:00
接下来我们看一个suming mon tree,其实看名字也知道呢,干嘛做求合的呗,做聚合的啊,它会自动帮我们做聚合,对于一些场景,咱们不希望他存的是明细,对吧?比如说我有一条明细,我想要知道是一些聚合结果。咱们传统用的时候怎么用啊。是不是把咱们经过过滤转化完的数据,明细数据一条一条插进去啊,比如说一条你弄完还有5000万条,那回头你要查的时候,是不是再去对这五,呃,根据这个明细数据再做一个聚合操作呀,啊,你是现场聚合对吧?那像这种场景可能你想想你存的数据量是不是大呀,空间存储的开销是不是大呀。而且你临时查询是不是也有开销啊,要做聚合呗,那在我们的click house,它提供这么一个。聚合的合并数。那他呢,就可以定期帮我们自动聚合啊,自动聚合,那么同样的道理,它只能算什么预聚合,不能是真正聚合,为啥呢?有几点,第一点它只能是分区内聚合,你跨分区它还给你聚合干嘛,那你数据该咋存呢?那你分区还有什么意义对不对?所以我们叫预聚合对吧,提前帮你聚合一点。第二一个它是实时聚合的吗?并不是它是什么。
01:23
还是一样的道理,分片合并的时候,他才会聚合。这主要是两个要点啊,这两个要点来我们来试试呗,那我们建一张SMT的表对吧,就缩写嘛,3S嘛。Modu MT嘛,好,那这边我们就引擎指定为3MEDU tree,那里面填的是什么。你想聚合的力,你因为你可能不是每一个字段都想做聚合呗,预聚合,那你就可以指定这个聚合的字段,也可以填多个啊,那大家想想咱们聚合是不是得有依据啊,也就维度啊,难道是盲目的聚合吗?
02:03
举个例子,咱们统计成绩的时候,要么求某个同学的总成绩对吧?比如说高考总成绩,要么求的是每一个班级的平均成绩。对不对,那你想想这种有个特点,它统计是不是应该有一个维度啊,说白了干嘛。Goodbye by啊,对,没毛病,Group,那你想想我这个语句它怎么根据什么维度帮你预聚合,大家觉得应该是哪一个东西决定的,是组件吗?不是,大家注意咱们click house最重要的是谁啊,Order by,它会根据咱们order by的字段。以它为维度,相当于说对他俩做了一个,然后做了一个预聚合啊。是order by啊order by来,那咱们这张表建一下建好了,呃,我们往里插一个数据插,插完之后咱们直接查呗,在新from。
03:02
啊,这个表明我直接拷过来了,看数据是不是少了。123456。我把它截一下呗。刚好这六条啊。但是我最终只有什么四条,这是为什么?其实跟咱们替换引擎一样,你在同一批次插入的数据里面,它会自动帮你做一次聚合,那我们看看啊,呃,咱们这里面的ID,你看101SKU001有几条啊。这是不是咱们order by字段,我们说的是按order by聚合的嘛,哎,你看是不是只有一条,呃,它是1000,好,所以是1000没毛病,这一条没什么好看的,呃,那我们再看多一点的,这个是不是多呀。哎,这里有条四的对吧,那应该是这一条再加这三条啊,ID为102 SKU为幺,呃,SKU为002,当然。
04:04
那它上面怎么还有一个分区不一样呗,是吧,那么就找6月1号的是不是这条这条这条。好,没毛病,那前两个字段不用聊了,ID跟SQID肯定要有的,接下来我们建表指定是不是按照total mountt进行一个预聚合啊,那我们看看它聚合的对不对啊,应该是我用红色的来,呃,怎么又变成这个了。是不是一个2000。还有一个两千一万二对吧,那你加一下这个是多少,是不是应该是一万六啊。对吧,没毛病,一万六好,这个聚合大家能看懂,那至于上面这个。这一条为什么没被聚合进去啊,这条因为它是另一个分区的嘛,我们说的是分区内预聚合,那还有一个前面三个字段大家搞明白了,那最后一个字段呢。你想想我。
05:02
这三条红色的相加的时候,它的时间是不一样的,分区是一样对吧,但小时是不一样,一个是11点,两个13点,那你看它保留了谁了。11点,也就是说他取的是什么,最先最早的一条啊,其他字段取的是最早的一条。能理解吧,这就是一些细节问题啊,细节问题,那么如果我这个时候再插入一条呢。啊,比如说我,嗯,这样我。把这些干掉啊。哎呀,好长啊。应该在记事本改会方便一点啊,比如说我现在插入一条重复的啊,101,呃行就101呗,然后SK这个,那数值给个2000,那时间我改成13点,那这条数据是不是跟这条。首先是同一个分区的吧。
06:01
对吧,那这两个维度是一样的吧,那时间它晚一点吧,那我们看看它的效果啊,来回车。我在查,你看合并了没有。是没合并呢。这条跟这条是不是应该是同一个分区里的数据啊,那我现在手动执行合并。这呃,这张表final,然后呢,这两条是不是应该加在一起啊,前两个字段。肯定一样的。是咱们orderbi字段啊,就是咱们预聚合的维度,那这两个是不是加起来变成3000啊,那最后一个字段呢,是不是取最早的一条啊,那应该是保留谁啊,12点啊12点哎,执行,那我再查你看。是不是12C。是不是3000?
07:00
对吧,这个就是咱们的一个聚合的合并数啊,聚合的合并数。那咱们总结一下啊,呃,以。指定的列作为一个汇总的数据列,数据的列对吧,咱们前面里面传了一个金额。那么还有其他一些事项可以填写多列,但必须是什么数值类型的,你想想你如果你不是数值,我还怎么给你聚合呀,对吧?呃,如果不填呢?它是以所有非维度列且为数字列的字段作为汇总数据列,也就是说啊,呃,什么叫非维度列?Order by是不是咱们的聚合维度啊,IDSQID嘛,就group by的那个维度嘛,对吧,也就是说除了order by的字段之外,其他所有字段里边,但凡是数值类型的,它都通通都会做一个什么聚合。啊。
08:01
呃,不在一个分区的数据不会被合并,对吧,它是分区内合并啊,BI是维度列,作为维度列。呃,其他的列按照插入的顺序保留第一行对吧?那同样的道理我们说什么呢?只有在同一批次插入,这个是新版本啊,好版本不会跟那个上一个pacing一样,或分片合并时才会进行聚合啊。大家注意这个同一批次插入这个老版本是不会的,再强调一遍,两个引擎都一样的啊,或分片合并时才会进行聚合啊。好,那你想想在开呃,咱们在实际开发里面,呃,设计这种聚合表的话,咱们的一些唯一建筑流水号可以去掉呗,为啥你你你不指定的话,它是把所有数字列都聚合了,那你的唯一建值可能是123,呃流水号可能是一串数字,也把它聚合是没意义的,对吧?那咱们可以呃手动指定这些列的啊。
09:11
手动指定列,嗯。那我们再想一个问题啊,呃,我既然这个引擎会做一个预聚合,那比如说我想查的就是根据order by字段的一个聚合结果,那我现在是直接这么写吗?直接时代的新,还是说我自己还要再写一个sum的逻辑在里边?你可能会以为他已经帮你做了聚合,那你在何何必再写个sum呢?没必要是吧?有必要你想想,想想这句话。是不是只有同一批次的插入或者分片合并时才会聚合,也就是说,是不是可能存在没聚合的时候?那你如果你的需求就是。
10:00
查询它的聚合结果,那你circle不好意思还是写上啊,上还是得写上啊。因为还可能没来得及聚合对吧。好,这个是咱们的一些注意事项啊。
我来说两句