00:00
啊,各位同学,那接下来呢,我们看最后一个优化手段啊,就是RO的优化啊,那首先我们先回忆一下啊,H base当中这个RO是怎么设计的,大家还能想起来吗?还能想起来吗?他是不是一共分为两部分呀,对吧,那一部分是什么?是那个boy ad。对吧,除了零就是一对不对,那后边这部分呢,是不是就是对对应的维度值啊,对吧,这是它那个R的这个结构啊,然后在这需要明确的一点是什么啊。需要明确的一点是啊,我们是不能去改变这个rie的结构的,咱们这个rie的优化改变不了它的结构,我们能改变的只有什么呢?我们能改变的只有这个维度在这个ROK当中的顺序。那这个怎么理解啊,比如我举个例子,我现在假设有一个ROK啊,那他的q boy的ID呢,比如说全是11111,比如说四个一啊,那四个一表明它是不是有四个维度,并且四个维度是不是都有啊,对吧?啊就这个意思,OK啊,那我们能改变的只有什么呢?只能说诶,我第一个维度代表的是,呃,第一个一我代表的是哪个维度,第二个一我代表的是哪个维度,第三个一代表的又是哪个维度,我们能决定的只有这个维度在当中的顺序,那它的结构,它的内容我们是决定不了的啊这个大家能理解吧?啊,就调整这个顺序啊,OK,那这个顺序咱们怎么调整,怎么去调整。
01:25
啊来,我们下边有两个原则啊,哪两个原则呢?第一个原则就是被用作过滤的维度放在前边啊,当然这个过滤肯定是什么时候过滤啊。是不是肯定是我们后续查询的时候过滤啊,对吧,也就是说诶被用作我们后续的查询的时候呢,过滤维度放在前边。OK,那下一个啊,第二一个原则是什么?是基数大的维度放在基数小的维度前面,大家还还能想起来这个奇数的概念吧,是不是有一个列count的值啊,对吧?啊,这是两个原则啊,那这两个原则分别怎么理解呢?我们一个一个来看,我们先看第一个啊,来,我把这个PPT点开,大家一起来看一下。
02:04
好,大家来看一下这个位置啊呃,这个图大家能不能看懂啊,这是一个啥呀?我给大家解释一下啊,可能比较抽象啊,那A和B这是两个维度字段,C呢是一个度量值啊,C是一个度量值啊,那这个呢,其实就是一个最终存储到h base当中的一个Q吧。哎,这就是存储到h base当中一个Q,这这这就是一个最终的计算结果啊,当然大家可能会想了啊,诶,你这个计算结果你存到h base之后,你不应该是啊,这个这个ROK应该是什么样的,应该是有什么1010完之后,后边还有维度值不应该是这样的结构吗?啊,那如果这样我要画成那种啊,可能这个效果就不是那么明显了,所以说呢,我现在又把这个RO呢给它还原了,我又给它还原到真实的维度上面去了,但是这个数据的顺序是一致的啊来现在呢,我们就假定这个A和B啊,就是一个RO,你把它俩视做一个RO啊,大家注意观察一下啊,这个ROK它是不是满足我们h base当中RO的排序规则,你就把AB当做OK啊,是不是满足?
03:05
那h base OK是怎么排序来着,是按照字典去排序对吧?那大家来看一下是不是这么回事啊,那B1C1D对吧,2A2B2C2D这个没问题对吧?OK啊,那进来我们就按这去来,那假如说我现在呢,有一个这样的查询,请求大家看一下能不能看懂,是不是select a字段B字段some c,然后呢,From这张表,那这里边有一个什么,是不是有一个分组by AB,然后。B大于等于小b and b小于等于小C,这是不是有一个过滤条件对不对?那你说这个过滤条件,它过滤出来的数据应该是哪些?是不是这部分是是个道理吧,对不对,但是你要你要注意一下,我现在这个数据是不是分散存储在h base这张表当中,是个道理吧,那这样一来是不是就违背了我们h base rock设计的一个原则,对吧?H base设计有一个原则,什么原则,就是将来我需要一起查询的数据,在写到h base的表里边的时候呢?最好怎么办?最好写在一块对不对啊,那你看我现在是不是这就是我将来要一起查询的数据,对吧?但是我放在一起了吗?我没有放在一起。
04:14
啊,那所以说现在就违背了这个原则啊,那我怎样能够去解决这个问题呢。我怎样去解决这个问题呢?嗯。怎样解决?其实很简单啊,那咱们是不是只需要调整一下这个ROOK的顺序就可以了,对不对,调整谁的顺序,调整维度的顺序对不对?你看啊,我现在假如说我把这个B往前调一下,把B放前面了,对不对,那B放前面之后,我同样去进行这样的一个这个骚查询,你看我这个数据是怎么分布的。它是不是就连着了,是这个道理吧?啊,那这样一来的话呢,那是不是就满足了我们前面提到那个RO的设计原则了,对吧?将来需要一起查询的数据,在写的时候我就给它写在一块,OK啊,那这就是咱们这个RO的这个呃优化的第一个点啊,就是什么呀?就是被用作过滤的维度放在前边啊,现在这个呃调整维度顺序这个概念大家应该已经清晰了吧,知道什么叫做呃这个调整维度的顺序了吧,就这个意思啊OK啊好,那接下来呢,我们再来看第二一个原则,第二个原则呢,是基数大的维度放在基数小的维度前面。
05:24
基数大的维度放在基数小的维度下面,首先大家先搞清楚这个基数的概念啊,这个基数基数什么来着,是不是就是count的值对不对啊?那接下来我们来看一下这个基数大的维度放在基数小的维度下面,这个又应该怎么理解啊?首先我们先来明确一点啊,那刚才这个原则实际上我们优化的是啥呀?是计算还是查询呀?这个优化的是不是查询,对不对,这是为了保证我们查询更快啊,OK,那下边这个原则呢,它优化的不是查询,它优化的是啥呢?是计算啊,是计算,既然优化的是计算,那所以说我们是不是得看一下它的这个计算过程啊,对吧?好,那现在我把这个PPT开注意啊,这块可能会比较难理解,大家跟紧一点啊,好,再来看一下。
06:04
因为计算的时候,我们不管是采用什么逐层计算,还是这个快速计算,那这两种算法都得怎么做,是不是都得先算最高维,然后再逐渐降尾啊,对吧?那假如说我现在一共有四个维度,而且呢,我已经得到了最高维的计算结果了,这是不是三四个一就表明呃,四维是不是都算出来了对吧?OK,那完了之后是不是需要降维,我需要降到三维,那当然呢,四个维度降到三维应该有几种几种降法四种对吧?啊,应该是CC43嘛,对吧?那当然我在这我没有全画出来,我只画了这里边的两种啊,OK啊,那假如说三维降完了,三维降维之后该干啥?是不是该降到两维了,对吧?你看啊,假如说我现在要降到两位,当然两位应该是有几种,是六种对吧?啊,当然我在这呢,我只以一个为例啊,比如说我现在需要得到一个这样的二维的数据。啊,大家思考一下啊,你说我这个二维的数据啊,它是从谁聚合而来的。
07:00
呃,先回答这个问题吧,你说这个二维的数据是从他们俩聚合而来的,还是从他俩的其中一个聚合而来?好好想一想,是其中一个还是同两个?这个必须先搞清楚啊,是其中一个还是还是他们俩其中。其实你能够能能能够观察到啊,这个里边是不是包含A包含B,它里边是不是也包含A包含B,对不对,说理论上呢,是不是它俩都可以得到啥是这个道理吧,那所以说我这到底是他们两个聚合得到下面这个,还是他俩其中一个聚合得到下面这个几个呀,道理不是两个是一个,其中一个就可以,为什么其中一个就可以,可能可能看这个图呢,不是那么的好理解,我们看一下谁啊,看一下之前我给咱发的那个麒麟的那个PPT,可能这个就好理解了啊来咱们看一下。来看这看这个图可能就好理解一点啊,那假如说这个是不是最高维的数据对吧,那假如我现在想得到一维的数据,你怎么办。是不是先降一个维度对吧,比如说我先降一个时间维度,我是不是得到它了,对不对,那得到它之后呢,我是不是再降一个维度就得到它了,是这个道理吧,那也就是说我为了得到一这样这样的一个一维的数据,我是从几个两维的这个结果聚合而来的,是不是就是一个两维的结果聚而来。
08:15
对不对,那我这个两维的是不是有三种,我是把这三种都聚合在一起的吗?不是这样的,对吧,我是不是只需要一个两维的呀,对吧?那同样的道理,我这为了得到一个,诶咱们这个,诶打开这个PPT,我为了得到一个这样的二维的结果,我是不是只需要一个三维的就可以了,诶就这个道理啊,只需要其中一个就行了,一个就可以,OK,那既然只需要一个都可以,他俩是不是都行,那我们选谁呢?对他他俩是不是都行,选谁都可以对吧?啊,那选谁都可以,我到底应该怎么选。既然选都可以,那咱们是不是肯定得优先去选择那个数据量小的对不对,谁数据量小我选谁数据量小是不是计算量它就小啊对吧,计算速度就快,OK,那麒麟它是这么选的嘛,麒麟不是这么选的,麒麟它是这么选的啊,麒麟选的时候呢,并没有根据计算量去选,呃,他根据什么选的啊,它是根据这个q boy的ID的大小去选择的,麒麟呢,他在选择的时候呢,他选择的是这个q boy的ID比较小的。
09:16
那他俩的QID谁小啊?就按照这个二进制数字的比较这个规则去比对吧,谁谁谁大谁小,显示这个更小一点,对吧,他加上个一是不是就等于前面那个没错吧,也就是麒麟他选的就是这个,那既然麒麟选的是他,那我们就得怎么样。我们是不是就得保证他选择的这个Q是那个数据量比较小的呀,是是这个道理吧,OK啊,那我现在问一下大家啊,你说这个和这个数据量的大小是由什么决定的。是由什么决定的?是由什么决定的啊,有的说呢,是由基数决定的,对不对,由谁的基数决定的。这是A级数是不是肯定是由ABC这三个字段以及abd这三个字段的基数决定的呀,为啥?你想想啊,实际上这个还有这个是怎么得到的,是不是就是正常情况下是不是拿到原始数据,那这个呢,是按照ABC3个字段进行分组聚合,那这个呢,是按照ABD3个字段进行分组聚合,是是这个道理吧,那所以说那它还有它的数据量大小是不是就是由ABC这个呢?是由abd这三个字段它们的基数决定的呀,对吧,是这样的啊,那当然啊,当然啊,当然由于这两边是不是都有A,都有B,那所以说A和B是不是咱们就可以不考虑了,对吧?所以说最终决定这两个他们的数据量的大小的其实就是谁,实际上就是C和D的基数是是这个道理吧,对不对,那所以说我们要是想保证这个Q,它的数据量比较小,那我们就得保证啥。
10:50
是不是保证D的这个基数是比较小的呀,是这个道理吧?啊,那所以说我们这儿是不是就得到了一个这样的一个规则,什么规则啊,就是基数大的我们得在前边,基数小的在后边,没错吧,你看C和D相比,是不是D的基数得小一点啊,对吧?哎,它在后边,那C的基数是不相得大一点啊,对吧,是际样,所以说我们就的结论就是基数大的维度向前调整,就是小的维度向后调整。
11:15
就这个意思啊好,那这个呢,就是我们的优化的第二一个原则。啊好了啊,那这两个原则咱们就都讲完了啊,其实这两个原则呢,一个优化的是查询,一个呢优化的是计算,好了啊,那这两个原则呢,大家能理解最好,如果实在是理解不了的话呢,这个记下是不是也能记住啊,对吧?啊就这样的啊啊那说了这么多,这个ROK我到底怎样去调整顺序啊,到底怎么调啊,很简单,我们还是打开外部页面啊,我们继续往下拉来拉,拉到哪呢?拉到我们这个下边,这是不是有一个R的优化,特别是R对吧?那怎么调整顺序啊,很简单,你只需要把鼠标指向这个ID,你看啊,上下拖动。诶,这是不是就能够调整这个维度的顺序来对吧?啊,那调整的时候呢,就按照我们刚才这个两个规则去调整就可以了啊,那这就是RO优化啊,啊那我把视频停一下。
我来说两句