00:00
好,那接下来我们看下面一个参数叫mapb draw啊呃,那我们刚才看到两个大表在做join的时候呢,它启用的是普通的video join,也就是说先扫描两张表,之后呢再进行一个join操作,但实际上在have当中,我们可以使用一个map join,也就是说将小表直接加载到。内存发送到所有大表的map,也就是说本来我们的join啊,这是一张表,这是一张表分别读取两个数据到reducer呢,进行相同的key呢做处理,现在呢,Map它是什么样子呢?诶,这是一张大表,大表呢可能会被分成好几个切片。好几个切片,比方说三个啊,那另外呢,我们还有一张小表,这小表呢数据量比较小,所以称为小表,在这过程当中呢,我们可以把小表呢给它。广播到我们大表的区域,每个大表呢,拥有一份全量的小表数据。
01:02
全量的小表数据,那接下来我们是不是在map阶段?就可以完成我们的join操作了,因为我们这个地方有一个K,可以拿这个K呢去小表当中找到对应的这个数据,我们可以在map阶段就完成我们的内容啊,这样的话就不需要去启用我们的reduce阶段,从而提高了效率。同时只要没有reduce阶段,如果说你数据有倾斜对不对,那么它也将不复存在,因为我们没有reducer,没有reducer呢就不会产生数据倾斜问题啊。呃,那当然我们可以设置开启嗯,Map。啊,Map对吧,好,那设置这个25兆以下的为当前这个小表啊好,那我们来测一下这个内容啊,测一下这个内容首先。我们可以查看一下执行计划,呃,那我们就看一下当前的,呃,不看level join,看普通的join。
02:01
啊,因为这个执行的时间呢,将会非常长,所以呢,我们都是通过explain的方式来做这样的一个事情,OK,好,那接下来呢,我们来执行这个色语句。好,这个呢已经执行完了,我们来看一下这个呢,茫茫复杂对吧?啊,它还是挺复杂的一个explain的语句啊,那我们来看一下这个当中呢,分为好多个不同的阶段啊,那首先我们可以看到这个当中啊,我们去找一下我们的关键词啊就OK了,呃,那我们首先看到整个的只有首先我们从上往下看啊来呃,它当中呢,包括这样的一些个阶段啊,首先第一个阶段呢,是我们的STAGE6,它呢是一个map叫local work map阶段,Map阶段,那我们去找一找有没有reduce阶段。并没有看到什么reduce阶段,好,那只是ma去扫描数据,那这个不用多说,那接下来这个呢,是一个map,哎,看上去我们要得知道有没有map juice的一个操作,对吧,那这边呢是map read tree这边呢,看到它是一个叫map draw的一个。
03:11
Operator。哎,启用了memory,那我们从这个MEMORY6当中看一下,它有没有reduce的操作呢?同样的也并没有reduce的操作。对吧,因为省略了我们整个的reduce操作啊,省略了整个radio操作啊,那这样的话我们效率必然会提高,那我如果说把memory设置为。Fourth呢?来看一下。同样的,我再去查看当前这个S的执行计划。好,那我们来看到这个内容啊,在我们已经将这个内容呢关闭掉以后啊,首先它是一个mapdu任务,扫描我们的S表,B表两张表大表,然后接下来呢,走的reduce阶段,看join放在哪了,在reduce阶段因为我们已经把number关闭了,所以他只能通过video join的方式来做啊,所以大家又知道当前这个优化方案指的是什么意思了,所以一般往往来说呢,我们要给它打开。
04:25
啊,要给他打开。哎,我们把这个属性呢,重新去设置一下啊。把这个拿过来。它是C,然后呢,把它粘贴到我们这个位置,这是我们所讲的一个map draw,好,那接下来呢,这边有一个点啊呃,如果说小表是主表。然后呢,是左连接的方式会失效,什么意思呢?比方说。FT,刚才我们用的是内连接对吧,那无论你把小表放在左边还是右边,它自动适应做这个事情,好,那接下来呢,我们就可以看到我把这个也做一下啊,首先呢,第一个我们看一下这个数据啊呃,往当前这张表里边去插入这个是一个join table,然后呢,从小表当中去join应我们的big table,那另外呢,Big table去照应我们的小表啊,那在这种情况下来说,我们来运行当前的这个语句。
05:24
好,首先第一个啊,这是小表去照应大表啊,小表是主表,那这个时候我们刚才已经将数据改回来了,开启了me draw,但实际上呢,它还是走的reduce阶段的一个draw left out join,对吧?好,那如果反过来我们要做的事情是大表转移小表,小表为副表对吧?好,那这个地方我们再运行,那那么此时呢,我们能看到。他走的一个语句呢,也是正常的一个video join,那我们来思考一下,为什么在level join这种情况下来说,呃,这种呢就会失效呢。
06:07
他就会失效呢。那举个很简单的例子啊,给大家看一看,你比方说小表是主表对不对啊,小表示我们的左边这张表啊,这张表当中呢,有。一二这个数据好,那我们大表呢,可能这个里边呢有一三,然后这个里边呢有。二。四。二四对吧?好,那按照我们小表要分发到大表的一个逻辑,如果说它可以使用map join,那么接下来呢,这个一三将会跟我们的一二做招引,那二四也跟一二做招引,如果可以的话,对不对?好,那接下来呢,一能关联上写两个一出去,呃,三关联不上,那不要因为它是右表的数据,那就空着,那但是这个二我们到底是写出去还是不写出去呢?
07:07
按照level join的一个原理,左表数据它是单独的,它是不是应该写出去,但是不好意思,呃,此时这个二。他知道另外的数据当中是否存在吗?他并不知道,所以他写出去不是,不写出去也不是。啊,所以在做这种处理的时候呢,那干脆怎么样。不走map join了,因为没办法走这个内容了,是不是只能走reduce join了,因为reducer呢还正常的分发,我们会将相同的K呢,发到一个reduce里边,如果说这个videoer没有找到对应的这个K,那我们就知道全局一定不会有这个K,那我们正常写出不闹就完了,但是如果说你用map join的时候,那这个事情没办法完成了,对不对?OK,这个一定要注意的,在map招引当中也是有时效的,不是说我们的这个表呢,是小表,它就是OK的。
我来说两句