00:00
好的,那接下来呢,我们看一下3.1节啊,整个第三章是从开课语法的角度做的一个优化,呃,那在这过程当中呢,第一个叫列裁剪与分区裁剪。这个就告诉我们,在我们写hi口的时候呢,呃,尽量的不要写c select星,或者说呢,不指定分区做全表扫描,这样的效率呢,会比较低对不对?好,那如果说我们只需要全表呢,有十个列,我们只需要其中的五个列,那我们写四两星能拿到我们的结果,但是如果说我们能把C拉的五个列写上,这样效率会更高一点啊,同时再结合如果我们做的是劣势存储,可能会更好一点了,对不对,同时叫分区产点,在我们经常会写到这个will过滤条件。啊,过滤条件当中呢,最好带上分区条件啊,因为这样的话可以避免掉全表扫描,只扫描我们所需要的这一个分区,或者说几个分区,这个一定要注意一下,提高我们的效率,这个东西呢都不难理解,第二个是我们的group。
01:14
呃,那默认情况下来说呢,Map阶段会将同一个K发送给同一个reducer,那当然没有问题,但是如果当我们这一个K的数据量过大的时候,那么是不是产生了一个数据信息,因为当前A这个数据量呢,可能能达到什么1000万,其他的B呀C呀,这种数据可能也就诶5万呢,3万这种数据,那如此一来A发送到一个reducer,那么接下来下面处理A的这个ER呢,将会任务执行的非常的慢。这个大家应该能想明白,这就是典型的一个数据倾斜问题对吧?那所以呢,我们第一可以开启mapb端做预聚合,比方说我们求一个count,那可以在map端做预聚合,八一个map当中的A全部聚合起来去做这个处理啊,那么第二块呢,我们可以看到去操作map单操作条目啊,我们可以把它值设置更大。第三个就是在有数据倾斜的时候,自动进行负载均衡,默认为false,我们可以改为触,那一旦为触的时候生成这种勾办执行计划的时候呢,它就会携带两个MR任务,那么第一个MR任务过程当中呢,会随机将我们的key生成到res里边,那么第二个。
02:36
那如果随机分配的话,那A这个数据是不是有可能会分散到下游所有的reducer里边,那每一个reducer拿到的结果都不是我们想要的最终结果,所以它会生成第二个MR任务,将我们前面随机添加的随机数给他。干掉,再进行重新做计算,第二次M2任务能保证我们所有的A全部进到同一个video当中啊,同一re当中完成最终的一个聚合,那也就是说分了两次聚合,也跟我们设置ma端的一个交易呢,有异曲同工之妙啊,只不过说数据量特别大的时候呢,我们map端呢,也不太好搞定了,对吧?我们可以用reducer更多的videor来处理这个数据,也就是说往往来说,如果数据量特别小的时候,那开启了我们数据倾斜的一个负展均衡,那么这个时候呢,往往可能会这个效率会变低,你比方说下面我们经常写的一个例子啊,这边呢,如果说正常的去写我们的一个思维语句,数据量很小的时候呢,它可能只有23秒,但是我们开启了数据信息之后呢,它会自动生成两个任务。
03:50
在两个任务过程当中呢,我们能看到最终执行一分六秒钟,那这个呢,反而变慢了,那因为数据量比较小,如果数据量很大,而且数据信息非常严重的情况下来说呢,那我们做了这个负载均衡的一个优化,那么会提高我们的效率,这个一定要注意一下啊,这是第二个,呃,那么第三个点在于矢量计算,所谓的矢量计算呢,也就是说在类似于我们直接看到SKY抓取数据的时候呢,它可以批量读取。
04:22
数据,而不是一行一行的处理,那这样的话明显的可以提高我们的效率,那相应的参数呢,在这一块。我们可以设置开启批量啊,就是矢量模式,另外我们也可以在reduce阶段开启矢量模式啊,这是第二个啊好,那接下来第四个点是我们所看到叫多重模式,这个讲的是什么意思呢?你比方说在这个当中呢,我们有这样的一个SQ语句。啊,当然了,这是三个,三个语句,我们有will。HHH只不过说年龄不同,都要写入到同一张表里边,那么对于这个S呢,我们可以去做一个什么事呢?那你看这个三个S语句,将我们的这张表student表是不是会扫描三次?
05:12
对吧,那完全我们可以做什么样的事情呢?我们可以将这个搜改写为from student,然后用这样的方式来做,那这样的话呢,我们这张表呢,只需要。被扫描一次就够了,通过这种方式呢来提高我们的效率。啊,这个表呢,完全不需要扫描多次,一次就够,那完全我们就可以用这种方式,接下来第五点呢,是我们所讲的叫in exist,现在我们很多语句当中呢,可以使用in exist排除掉一些数据,对吧?呃,那这个时候呢,我们也可以用left SIM join去代替啊,它是更高效的一种替代方案,那往往后面呢,大家用in exist的时候呢,我们可以用left SIM join的方式来代替这个。
06:01
使用啊,推荐这种使用啊,当然in和exist呢,它们之间也有不同的一个区别,一个呢是将我们数据放在每存当一个一个的去对比,另外一个是拿到我们一条一条数据去另外一张表当中进行一个查询。啊,这两者呢是不太一样的,对吧?好,大家知道一下这事就好了,因为在生长性当中呢,我们可能会用到in exist的时候呢,往往我们都会用level me join去做一个代替啊好,呃,那前五条呢,是我们讲的比较通用的一个什么内容,在这个过程当中,它是属于单表查询的一个优化。啊,是一个单表查询的优化。啊,完全是单表查询的,那么将来从第六个开始呢,我们要要聊的是多表之间关联的一个优化了。
我来说两句