00:00
那接下来我们来聊一聊另外一个很好用的join叫SMB join,这个其实have也有这个玩意儿,对吧?它的适用场景就是两张大表进行join的时候来使用,能够处理咱们这种场景,比如说你有张ETB的角,ETB的表跟一张2TB的表进行就业,如果你不做任何处理,它你的执行时长是非常非常长长的啊,那这个时候我们可以考虑用一个s MB join,那其实它就三个字母的缩写。S呢就是salt m呢就默GEB呢就bucket分筒嘛,呃,既有排序又有合并,又有分筒,是这样的,必须使用分铜表啊。那么基于这种场景呢,有几个要求,第一个呢。两表进行分桶,个数必须相等对吧,因为两表要关联的,你不能说对不上二对三啊,这不行,两个桶对三个桶啊,那不好去做,另外两个呢,咱们的交引列跟排序列跟分统列要是同一列,其实为啥呢,咱们分桶的字段。
01:15
比如说是一个ID啊,分桶字段是ID,排序字段也是ID的话,那不就很好了吗?那你看比如说我分成了两个桶,那么在ID,比如说咱们ID有1234这么四种值,对吧?假设只分成两个桶,那咱们分桶的时候,底层是不是走的哈希啊,也就是说ID相同的是不是一定在同一个桶,比如说这个一号桶里面,它有ID为一的,还有ID为三的啊举个例子啊,那再举个例,那相应的是不是ID为二跟ID为四的所有数据在二号头啊,这是A表,那对B表而言。假设它也是1234,那么他的时候。
02:03
分桶也是按照ID进行分桶,它也分成两个桶,那它也是一三再一个桶,二四再一个桶,并且呢,你想想看,咱们除了分桶字段,为什么要求排序字段要A级啊,因为咱们统同一个桶是不是可可能有不同的T1跟一或者三就是不同key嘛,对吧?然后他再根据这个所谓的key进行一个sort排序,也就是说他排完之后是很严整的,1111,然后三三,有序的数据处理起来是不是肯定比无序的更快啊。对吧,它排序的目的就是为了提呃,后面join的时候提高效率,那么对B而言,它这个桶里面是不是也是111333也是有序的,对吧?好,接下来重点来了,基于这个条件,咱们两张表勾引关联条件是谁啊,是不是也是这个分筒跟排序的这个T是同一个是ID啊,那么接下来他A的话。
03:02
他是不需要对B所有的桶进行交易,为啥他想要的数据是不是一定在一个桶里面?对吧?所以是不是只需要A1跟B1互相之间去join就行了,然后A2跟B2去join就行了,这个就是一个分而制之的思想,对吧?将大表拆成一个一个的桶,那再根据咱们排序分统join引字段三个一样,那咱们只需要一个桶与对方另一个桶join就行了,而且都是有序的数据,那这样的话就能解决大表跟大表join效率低的问题。好,这是一个s MB doing啊,这就它的作用,Have的那个也是一样的道理啊,那咱们这边分同表,咱们是提前准备好了,同学们,咱们现在不是有三张表吗?那三张表不是有两张比较大吗?原始数据一张两个多G,一张四个多G,对吧?啊4.7应该是二点几来着。
04:06
呃,相对来讲这两张表会大一点,咱们就拿这两张表做一个join,那我们是不是要先准备分通表啊,有的人会说,那我如果一开始建的就不是分通表,而且就ID什么什么都不一样,这个很正常,对吧?那这个时候你可以选择做一个什么呢?中间表嘛。你要做这个需求的时候,你先建个中间表,你不用改原表。你把原表插入到一张分筒的中间表,另一边也插入到一张分筒的中间表,然后呢,你用中间表这两个就都是分筒了呗,呃,然后再做一个s MB join就行了呗,那其实这个分筒表咱们一开始呢就准备好了啊,其实让最早准备数据让大家执行的初始化这个类里面,大家可以看到初始化分同表啊,也是帮大家做了,所以还会执行时间那么久,对吧,还要对两张表分同,呃,咱们看看这个方法。
05:06
初始化分总表啊,读取原始数据分区字段啊,存储格式啊,然后呢,你看八级的BY对吧,分成五个桶,分桶字段or的ID,另外一张表也一样,五个桶or的ID,然后呢,还没完,后面还会执行一个sort by,它也是sort by他们的字段也是。ID。这就是咱们给大家做的分通表啊,分通表那后缀呢,我会带上一个class啊,Class我们可以到HDFS头眼啊,带这个库路径下面啊。这张表跟这张表就是咱们事先准备好的一个分通表,这个是已经好了,接下来咱们是不是只要做一个join就行了,对吧,好。
我来说两句