00:00
同学们map的方法呢,我们就讲到这里了啊,但是其实从之前的演示效果来讲的话,同学们有没有发现它的效率性能应该不会高,对不对,为什么呢?它是一个把逻辑做完之后再走另外一个,对不对?那么这个时候你会发现它是一个一个做,是不是感觉类似于咱们之前那个IO当中那个字节流啊,他读一个处理完了再读下一个肯定不高,对不对?那咱们当时是怎么去优化呢?咱们当时是不是提供了我们的缓冲区啊,诶在我们Spark的算子当中也有一个类似于缓冲区的这个转换操作,这个咱们接下来给大家介绍一下,它的名字叫map parts,所以我们接下来把这个咱们操作一下来拷贝。拷贝以后我们写成零二,这个呢,把这个去掉啊来拷贝一下,点击OK放过来以后,那这个呢,我们就去掉了,好,我们跟刚才一样,我们写上S,我们叫做RDD,它等于sc.make r DD括号,然后LIST1234,然后我后面给个二,就意味着我现在要把1234,我要分成什么两个区,诶就是这样的,好了,那我现在干嘛呢?我刚才说过了,咱们的RDD的map方法呀,它其实功能非常的强大,但是它的性能不够高,那怎么办?诶咱们有一个点叫map parts。
01:35
那么这个方法呢,它的性能就比较高了,为什么说性能比较高呢?原因很简单,它是把一个分区的数据全给你拿到了之后,你在做操作,而不是一个一个那个做操作,所以说他给你提供的这个函数就是迭代器,再变成迭代器就行了,所以大家看啊,来我们这里给它拿过来,咱们写上叫迭代器,然后我们再来,我们写上迭代器,点我们的map,然后下划线乘以二。
02:09
下划线乘以二是什么意思?就是说我要把这个迭代器当中的每个元素给它乘以二,那这个时候我就要搞明白一件事情了,搞明白什么事情呢?我们的这个里面是什么样的值,对不对,诶就是这样,其实这个也简单啊,为什么也简单呢?我们在map的时候,我们是不是可以给他演示一下呀?诶咱们可以演示一下啊,好,这个地方为了让大家看的方便,我们来看看他执行了多少次吧,咱们执行了多少次啊,咱们这里来,我们写上叫做箭头吧。然后我们这里点叫VAR回车,咱们叫做MP啊,咱们叫map parts r好,那我现在呢,把这个拷贝。拷贝拿过来我们点叫collect,然后诶我们也不用干别的啊,只执行就可以了,行不行,我觉得还是应该打印一下是吧,打印一下我们的结果吧,咱们的print。
03:04
OK,我现在来运行一下运行,那这个运行啊,它的结果你就会发现咱们有多少个分区,这个箭头应该执行多少次啊,应该是这样的一个过程啊,所以呢,我们来看看吧,这个map parts好往上走,往上走大家有没有发现它其实就是我们的什么两次,为什么两个分区嘛,每个分区走一次,每个分区走一次,那这个迭代器拿的就是这个一个分区的数据,一和二,然后一和二,每一个再去做我们的什么我们的map映射,那这个可是我们的内存中的操作,它的性能就比较高了啊,它的感觉就类似于我们P处理的感觉啊,所以map partitions还是不错的,我们通过刚才的描述,你们应该也能够感觉出来。它是一次性的把一个分区的数据全都拿了过来,那么大家想想它就存在了一个问题,什么问题呢?如果我们的数据处理完以后,它就不会被释放的,为什么呢?因为你现在拿了一个集合去引用这些数据,可是你并没有把所有的数据处理完,那么我的引用就依然存在,那么如果存在的情况下,我们的数据是不会被释放的啊,它用用完了之后,内存还一直什么被占着呢,它不会释放,所以啊,在内存比较小,数据量比较大的情况下,用这样的一个算子其实可能会出问题,所以咱们这里来说一下啊,咱们叫map partition,那咱们说一下,嗯。
04:37
它可以啊来,可以以我们分区为单位啊,为单位进行我们的数据转换操作啊,咱们叫转换操作啊,但是啊,我们说有问题啊来,但是它会什么呢?我们整个我们分区的数据加载到内存中啊,加载到内存中进行引用啊进行引用,这样的话呢,来。
05:03
那么如果处理完的数据啊,它是什么呢?是不会被释放掉的,被释放掉为什么不会被释放掉呢?就是因为它存在我们的引用啊,存在对象的引用,所以啊它是不会被释放的,那么在数据量比较多,我们的内存比较小的情况下,就容易造成内存溢出来,在我们的内存啊较小。然后呢,我们数据量较大啊,咱们叫较大的场合下,场合下那容易出现。啊,咱们的内存溢出,诶这样的话我们说了可能还是用map会更好一些,你用map partition,你的目的是为了用那个缓冲效果对不对,它提高效率,但是如果内存溢出了,你还是用之前的map,因为map呀是没有引用的嘛,你来一条处理一条,那我处理完了数据不就可以释放掉了嘛,对不对,那这样的话就空闲的内存了,这样的话慢是慢一点,但是最起码不会造成错误,这不挺好吗?对不对?所以啊,两个方法它的应用场景是不太一样的啊,这个同学们需要明白啊。
我来说两句