00:00
好了,同学们,我们接下来来讲这个叫RDD的持久化啊,咱们说一下,但在讲之前呢,我们先给大家呢,把这个代码咱们先简单的写一下啊,嗯嗯,这个呢,我们点击new创建一个包啊,咱们叫persist啊,就是持久化的意思,然后点击我们这边new。咱们叫SPARK01,咱们叫RDD,然后呢,我们叫persist。好了,然后呢,这边给他一个我们的man啊,行,放过来以后咱们随便打开一个啊,咱们点开把这个呢复制一下,嗯。好了,然后呢,我们S点啊,我们的stop,那我现在想做一个什么样的功能呢?我就想做word count啊,咱们就想做word count,那么如果你想做word count的话,同们看,我们现在写上咱们叫做集合啊,给个list等于new啊,不要new了,咱们就写上一个咱们叫hello,然后呢叫做scale,然后呢,再来我们再写上一个叫hello,哎,我们叫做Spark,嗯,行了,就这么简单,然后呢,我干什么呢?我这样咱们的RDD,它等于我们的sc.make r DD,然后写上一个list,诶,咱们这么写,写上以后你要做word count的话,那么RDD点点什么呢?我们这里来写上一个叫flight map下划线点叫split,然后加个空格,然后呢,我们写上咱们就叫flight r DD就可以了,写完之后,那我得把它变成我们的那个嗯,KV类型的方便统计啊,所以flight r DD点我们这里map。
01:44
然后写上一个括号下划线逗号一,然后呢,我们写上叫map r DD,你这么写完了以后,那就方便统计了,所以map r DD点我们叫reduce by key,下划线加下划线,这个时候点一下VAR回车,咱们叫reduce r DD,这个时候大家想一想,那是不是我们的word count就出来了呢?诶,所以我们直接来点我们叫collect好,然后呢,点我们这里呢,给它来我们的for each好,For it之后我们给它打印,所以说这个呢,Word看了就出来了,但是呢,我突然发现呢,诶,我现在可能不想统计它的数量,我只是想把这个单词放在不同的组当中,所以啊,我可能不需要聚合。
02:29
就是我想做两个功能,一个是统计word count,还有一个我想看它分几个组啊,或者说我们把这个单词分个组就可以了,不用做聚合,那这个只分组不做聚合的话,你是不是就不能用这个reduce了,可是这两个功能我都想有,对不对,那怎么办?所以是不是得再来一遍了,所以大家看一下,我们就把这个呢,再来拷贝一下啊,拷贝拷贝以后呢,我全给它改成一啊,全给它改成一,改成一啊,然后这个地方改成一,那么它也改成一,都改成一,但是到了这就有了变化了,来,我们写上叫map r DD,点我们说了叫group by key啊,然后呢,我们写上它,我们叫group啊,咱们的RDD等于它,然后把这个拿过来,然后中间呢,我加上一个星号啊,中间我们加上一个星号,嗯。
03:20
好,那我现在的这个地方,大家会发现其实呀,我们其实上面是聚合,下面就是个分组,那么现在我们来运行一下啊,咱们来运行看结果,看一看结果跟我们预想的是不是相同的,咱们就是先做word count,再做一个分组的操作,对吧。好了,同学们,结果已经出来了,好像没有什么太多的问题吧,我们的SPARK1HELLO21,这是不是work count,然后这个地方我们是不是分了我们的几个组啊,而且hello是不是有两个value,所以这个跟我预想的是一样的,但是大家有没有发现一个现象,什么现象?就是我们这里的很多功能其实是重复的。
04:04
什么意思,什么叫做重复呢?就是比方说咱们读取数据啊,读取数据源,你这做了一遍,我这做了一遍,然后呢,你的这个叫map,我这也叫Fla map,你叫做map,我们也叫map,所以说你会发现前面的步骤其实是完全一样的,其实这个都可以不需要。啊,对不对,不需要,那么就意味着你的步骤是完全一样的,只有在最后一步它不一样,那你何必每个都写一遍,那多麻烦呢,对不对,所以把这个呢,我们给它来啊,就是我发现了这个感觉啊,代码量有点多了,所以呢我想简化一下,所以呢写上一个二,然后呢,点击OK,点击完成以后干嘛呢?我发现了它有重复的地方,对不对,那所以呢,我把重复的我就去掉了,把这个去掉不要了,我不要了以后干嘛呢?你不是叫map r DD吗?我直接把它拿过来,因为你已经映射好了呀,我直接拿过来给他做不也就行了吗?所以大家看啊,我的思路呢,就变成了现在这个样子,就是把重复的给它去掉,把对象呢给它重用起来,嗯,好,那现在我把这个代码稍微改善一下,看看这个结果跟我刚才预想的结果是不是一样的啊,所以这个地方呢,我们也稍微的变一变,嗯。
05:20
好了,那我们现在看一看结果吧,大家有没有发现这个结果是完全相同的,但是这种方式是不是就比之前要好一些,最起码咱们的对象咱们重复使用了吧,哎,就是这样,那这不挺好吗?对不对?但是我告诉大家这么理解是不对的,为什么呢?因为啊,记住啊,咱们所谓的这种重用,你看着好像是没有问题对不对,但是其实细节上底层上其实问题还不小呢,咱们这里呢,为了给大家说明方便,咱们来给大家画个图啊,呃,我现在咱们的这个地方来啊,比方说我现在读取数据,咱们叫做test file放到这儿。我们写上啊,咱们叫做什么呢?叫text file好了,然后呢,再来复制,复制以后呢,我们写上啊,咱们叫做flight map,然后呢,我们再往下走,咱们叫做什么呢?Map,然后呢,我们再写下面,咱们这边呢,叫做什么呢?咱们叫reduce by key reduce by key对吧?诶就这样的好,那我的箭头呢,我们拿过来,我们从咱们数据源当中把数据给它读取过来,我现在呢,把这个诶数据源拿过来啊,然后呢,标识上我们的这个黄色啊好了,然后呢,我们的箭头它指向咱们的这个位置啊,那么指向这个位置以后,咱们的这个我们的text file,然后呢们这边读取,读取之后map,然后呢,我再给它来放这边,然后呢,我们再来诶放这边,所以啊,这个其实感觉上没有什么太大的问题,对不对,哎,就是这样,可是呢,我刚才说过了,咱们可能又做了另外一个操作,另外一个操作是怎么回事呢?是这样的,它这个地方呢,是我们的map前面都。
06:57
没问题,但这个地方变了,它叫group啊,咱们的by key了,所以啊,在这种情况下我会发现,诶好像数据源是一样的,它的这个功能也是一样的,所以我刚才想了个办法干嘛呢,把这些对象呢给它重用,所以呢,我们拷贝,拷贝以后,诶往下来,往下来以后,我们所谓的重用就意味着相同的我不要了,对不对,相同的我不要了,把它也去掉,去掉以后,那是不是意味着我们就可以这样干了呢?
07:29
大家想想是不是这样的,所以呢,我们这里点一下点一下诶反过来,嗯。好了啊,所以呢,现在我们从map开始呢,就可以到reduce by key,也可以到我们的group by key了吧,诶没问题,所以我们感觉上这么是对的。但是我们讲过一件事情,不知道大家有没有印象,我们讲过RDB中它纯数据吗?同学们,你们想想RDD中存数据吗?不存吧,诶对了啊,不存啊,所以我们RDD中啊,记住它是不存储数据的,它如果不存储数据的话,那就意味着当我的map中的数据,它执行完map之后,给了reduce之后,它里面还有吗?它如果里面连数据都没有的话,它怎么可能到group by呢?所以说你就会发现在当前的逻辑当中,这个是说不通的,为什么说不通呢?就是因为我们的数据在我们之前的操作当中已经没了。
08:30
对不对,没了,诶,所以就是这样,那好,那既然没了的话,怎么刚才我们的打印还都是正确的呢,这不觉得很奇怪吗?对不对,所以啊,我们现在要想一想发生了什么事情,到底发生什么事情,所以我们告诉大家,RDB中是不存储数据的,那么所以啊,如果。如果啊,一个RDD它什么呢?需要它重复使用,那么它需要重头再次执行啊,再次执行来获取数据。
09:05
所以啊,那就意味着他认为就我们认为它会报错,但其实没有报错,为什么呢?就是因为当我们把这个map重复使用的时候,他会从头再走一遍,把数据读过来,然后再走这条线,所以说你看的是对象重用了,但是数据并没有重用,所以啊,这个咱们要分清楚,所以呢,我们这里说一下这个现象是什么呢?就是我们RDD的对象啊,来它的这个对象它是可以重用的。但是我们的数据无法重用,为什么呢?不保存嘛,它无法重用就是这个概念啊,那为了证明我们刚才给大家说的这个现象,我们这里呢,给他来啊。呃,怎么来呢?我就把咱们这个map吧,大家看啊,我们写上一个咱们叫做word,嗯,好,然后呢,写上一个画括号,然后这个改成咱们叫做word好了。
10:00
我写完以后大家看一下啊,咱们在这个地方,我们给它来,我们就写上叫做什么呢?星号,嗯,好,咱们叫做星号是什么意思呢?就意味着我们现在啊走到这个map了啊,咱们现在呢,来运行运行看结果吧,看一看我们的运行结果啊,诶我觉得不太对啊,哪不对了呢,因为这是星号的话,看到可能会有点乱,所以呢,我这里不用星号了啊,咱们用什么呢?用这个圈A吧,诶意思意思啊,就是告诉你他在星号之前执行星号之后其实它也会执行啊。来我们运行一下啊,看一看这个结果,好,大家有没有发现在咱们星号的前面这个圈已经执行了,然后呢,我们下面是不是也执行了,说明啊,这就叫重复执行,它就会把咱们的数据呢,给它重复的读取,重复的执行,所以啊,你对象重用其实意义并不大,为什么呢,数据还是从头。那么你其实跟写两遍有什么太大区别呢?区别并不大呀,啊,你增加多那么两三个对象能差多少呢?对不对,差不了多少啊,诶老师,那你这不行啊,你这个从头读,那你的性能太差了,对不对?那比方说啊,那我们这个这数据量比较大,那么你从头读的话,那肯定性能比较低啊,对不对?那么有没有什么办法能够让咱们当前的这个性能提高呢?那么其实啊,如果你想让性能提高的话,就意味着你不要重复读取,对不对?同学们是不是这个意思,可是你怎么能够让数据不重复读取呢?诶,那就是在我们的reduce by key的这个操作过程当中,大家看啊,什么意思?就是说在我们的map把数据给他的时候,先别着急给干嘛呢?先把它放到一个我们的缓存或者文件当中,这样的话呢,我们放到了内存或者文件当中的话,好像就不需要再从头读了吧,所以大家看啊,咱们的思路有所变化了,来拷贝拷。
11:57
背以后复制,嗯。往下走,往下走的话就意味置呀,咱们这两个东西呀,干嘛呢,往后挪,往后挪的话就意味着同学们看啊来诶往这儿,我们在map的这个位置呀,我们给他加点东西,诶加点东西,加东西,这个加东西是加我们的内存还是加我们的文件啊,这要看我们实际的要求了,因为你放在内存当中可能不安全嘛,对不对,你放到文件可能慢,所以说你要衡量啊,它不是固定不变的,所以呢,我们的map要把想办法把它放起来啊,把里面的数据我放起来,放起来以后,那这个时候咱们后续的这个reduce by key和group by key,它都从我们这一块取不就完了吗?对不对,同学们想想是不是这样的,你这样的话,这个数据不就可以重复使用了吗?你之前RDD是不能够保存数据的,但你放在内存中,它的数据是可以保存的呀,所以在这种情况下,我们感觉上不就好很多了吗?对不对?同学们,诶,就是这样的啊,所以这个地方我们就称之为叫。
12:59
持久化操作,所以把这个文字呢,我放过来啊,来我们的持久化操作。
13:06
因为啊,咱们这个map呢,它可以保存成内存,也可以保存成文件,咱们就统一都称之为叫做持久化就可以了啊,所以这是我们的一个基本操作啊,基本操作那这个代码我们该怎么实现呢?其实非常的简单啊,同学看我们回过头来,咱们这边有一个什么呢?来拷贝,拷贝之后有一个叫做点儿,诶我觉得先,我觉得换一个吧,咱别用它了。咱把这个地方写上一个零三啊,然后呢,我写上一个,它点击OK,然后放过来,这个时候干嘛呢?我在map r DD的这个位置,我们点点什么呢?我们叫做cash,诶缓存,刚才我们说过了,你的这个持久化是可以把它放到文件当中,也可以放到内存当中,你要考虑放在内存当中可能不安全,放到文件当中可能性能低,对不对,但是呢,它都可以将数据给它保存下来,这个操作咱们称之为叫持久化操作啊,那好,回过头来我加了一个cash,那么你加完cash之后,它这个地方我们点击啊,我们的执行看一看这个圈还会不会。
14:16
再次执行,这个是我们要分析的啊。好了,大家有没有发现在星号的下面,我们的这个圈就没有再执行了吧?这就说明它已经可以数据重复使用了,放在内存当中非常的方便啊,所以把一个持久化的一个基本的概念和演示告诉大家,好吧。
我来说两句