00:00
好,同学们,我们Spark circle呢,已经给大家讲完了啊,我们说过了,在这个章节当中,我们主要学习的是Spark circle的简单应用和它的基本实现原理啊,那具体的circle文的学习不在我们的范畴当中啊,这个下来呢,同学们需要自己去看,而且在后面的项目学习当中,老师会教你们啊,所以这个没事儿,那我们接下来呢,就把咱们SPA circle呢,课件呢,我们再重新捋一下啊,再把它做个总结吧,好不好,同学们来。呃,我们在最开始给大家讲了一下Spark circle的一个渊源啊,所谓的渊源呢,就是说它和have之间的一个关系,它来自于have,因为早期的时候呢,以简化map开发,那么我们的Spark觉得呢,RD也可以这样,所以呢,就把have跟Spark相结合成了一叫S的一个我们的框架工具,但是后来发现呢,这个S工具啊,受到了have的制约,那么整个的性能提升的并不是很好,所以后来毅然决然的把那个have从我们的S中剥离出去,这样的话就产生了我们的Spark circle,所以啊,它的含义跟have没有区别,用circle的方式来简化RDD的开发,对吧,你have呢,是用我们方式来简化我们map的开发,含义上是一样的啊。呃,那么从我们的底层实验原理来讲的话,它也做了一些优化,所以比我们自己写RDD的效率呢,其实还是要高一些的,嗯,好吧,同学们,咱们大概的再了解一下,嗯。
01:29
然后呢,我们接着就往下拉,往下,呃,下面呢是这样的,我们Spark circle啊,它为了能够简化RTD的开发,提高开发效率,并且提高执行效率,它对我们早期的Spark的一些封装,封装以后,那么RT呢,就封装了两个模型,一个叫data frame,一个叫data set啊就是这样,那么什么叫data frame,什么叫data set呢?其实data frame啊,就类似于我们的二维表格,那么二维表格大家应该比较熟悉了,写个文就可以访问,对不对?诶,所以啊,这是我们用Spark circle一个最直观的一个用法啊,但是data frame呢,它其实就是关心我的数据的结构,你像咱们RDD根本就不关心咱们的结构是什么,只关心你的数据是什么,比方说给你个一,我哪关心这个一代表什么意思呀,我不管,我只要关心有123就够了,对不对,所以啊,这是我们RDD关心的,而咱们的data frame更关心的是一所代表的含义,比方说它是一个组件,它是个ID,它是个。
02:29
年龄,它是个age,那么这样的话,我可以通过circle的方式去查询它的数据,那就会方便很多,所以啊,他更关心是它的结构啊,所以呢,我们在这张图当中会体现出它们俩的区别,嗯。然后呢,我们再来往下看啊,下面下面有个叫做我们的data set data set其实我们在学完之后再回过头来看,那么data frame呢,其实是特定泛型的data set,所以在当前版本的SPA当中已经不存在所谓的data frame了,其实全都是data set,为什么?因为data set是一个强类型的数据操作,它里面的数据模型当中封装了我们的类型,又有结构又有数,还有类型,那你想想用起来多方便呢,对不对啊,类的属性咱们就很好操作了,但是如果你没有类型的话,没有属性,你只有结构的话,那没办法了,你只能按照它的顺序来访问,这样的话就非常的麻烦,它不方便啊。所以data set呀,你可以简单的理解为就是我们的data frame的一个升级版本,对不对?哎,这么理解是可以的啊。
03:32
好,我们后面呢给大家演示了一下Spark circle的核心编程,这个核心编程咱们用到了一个核心对象叫Spark session,其实啊,就是我们Spark当中那个Spark的升级版本,他把咱们之前的那个环境也包装了一下,包装了之后,然后呢去完成它自己的开发,所以在我们当前的处理过程当中,我们会有一个Spark,记住在咱们命令行空工具当中有一个名称叫Spark的变量,它代表的就是Spark session,那么自己写程序倒也无所谓了,对吧?你在idea里面自己写程序,叫什么名不都无所谓吗?
04:07
然后呢,这里面有data frame创建,Data frame建分很多种不同的方式,比方说从我们的数据创建,或者呢我们从那个中创建,或者从R建,其实都是可以的啊,很多种不同的方式,然后呢,我们当创建好我们data frame之后,我们可以用法来访问其中的数据,那么你要想访问其中数据的话,就得有一些表,对不对,它这里面有个叫做type view,叫临时视图,这个咱们给大家说过了啊,然后呢,我们就可以通过我们的circle口来访问这个临时视图当中的内容,诶就是这个意思,但是它涉及到一个全局的概念,就是默认情况下,你的这个视图啊,是不能跨越session的啊,不能跨越绘画的,如果你要想创建一个新的绘画的话,那你的新创建表,那这样的话有点不方便,所以我们这里会有一个叫全局表的概念,全局的话有个叫global啊,有叫global全局,所以啊有个叫create global。
05:07
呃,View叫全局视图,那么你访问的时候就得把这个前缀加上,也就是说它的范围加上,否则你访问不了,嗯。然后接着往下,下面呢是另外的一种叫DSL语法,一种特定领域语言的一种方法,这种方法呢,原因很简单,是因为我们data swim里面本身就已经有数据了,那么而且它里面也有结构了,那么既然有数据有结构,你何必非得当成一张表来用呢?我直接就当成数据源来用不也行吗?所以他就提供了一些方法,比方说select呀,比方说我们的这个叫group呀,还有啊这样的一些方法,让我们来使用这些方法呀,其实等我们用的时候,你会发现跟我们RDD的那些方法非常的类似,什么呀,包括什么啊之类的啊,包括什么的呀,非常类似,同学们,所以这个呢,需要同学们下来好解一下,我们讲因很类似,对吧?接下来下面呢是r data frame,还有data们三之间的换,那么我们RD有数据没有结构,那么你要想转换成data frame话,得把结加上,你把。
06:17
加上的话,它有个专门的方法叫to df啊,把那个列名给它加上就行了,但是呢,在我们的命令行工具当中,你什么都不用管,这个都是自动完成的,但如果在idea当中的话,就有点麻烦了,因为它需要导入一个隐私转换的规则,所以啊,这个大家知道就行了,大家知道怎么回事就可以了,不要忘了,然后呢,我们接着往下啊,往下面呢是我们的data frame r么?你data frame把R对不对?所以啊,这操作就有一或者个法,就叫RD就了。然下面呢是我们的data data是一个类型的一个,那我们只要把类型相关的数据给它,其实是没有任何问题的啊,那么我们的这个data set也可以跟RDD呢相互做转换,但是呢,相互转换的话,RDD和data set中间就差一个叫data frame,所以呢,我们一般情况下是可以通过DD转换成data frame,再转换成我们的data set呢,其实。
07:17
要想直接转也行,但你要直接转的话,你又得有结构,又得有类型,诶这个时候样例类是一个好的选择,对吧?那所以呢,我们一般会创建样例类,直接把RDD转换成我们的data set,里面有个方法叫to DS,然后呢,我的data set呢,也可以转换成咱们的RDD直接转,反正你有结构,你有类型,你有数,那么OK,我们把这些东西全去掉,只剩下数不也就够了吗?所以它叫RDD啊,啊,这是他们的一个转换关系,那么我的data frame它有数据,有结构,但是没有类型,你只要把类型加上不就可以了吗?所以啊,它提供了一个方法叫做S,叫作为什么什么来使用,哎,把类型给它加上,作为U的类型来使用,那么你有结构,有数据,还有类型,这不就可以了吗?所以啊,Data frame和data set在这边也是可以互相转换的,而且data set想转换成data frame也非常的容易,你把类型去掉其实就够了啊,它叫to。
08:17
点F,好,那么三者的转换关系咱们就不说了,咱们现在就知道他们什么1.0 1.3 1.6,他们在不同的版本出现,有先有后,其实就够了啊呃,三者的共性啊,包括它的区别啊,咱们这里不再详细的给大家说了,这个同学们下来呢,可以看一看我们的课件啊,把它稍微的理解一下,然后这张图呢,是我们在学习的过程当中,我们给大家一步一步画出来的,画他们图的含义呢,是希望大家有一个层次的感觉,就是RDD只关心数据,咱们的data frame在数据的础之上,还关心它的结构,而我的data呢,在我们有数据有结构的基之上,关心它的类型,所以啊,就是一种包含的这种感觉,是吧?诶大家体会一下,好,后面呢,就是我们用idea来开发Spark circle了,这里面首先要增加依赖关系,然后呢,我们在使用的过程当中有一个这个东西就是创建环境对象,这个创建环境对象跟咱们之前有点不太一样,是因为它的创建方式并不是说直接扭出来对吧?诶先把它创建啊,有个build。
09:17
Build们R转成的,所以呢,我们这里呢,是需要提供这个东西的,如果你要写错的话就出不来了,然后里面具体的方法就跟我们命令行工具中的方法其实没有什么太多区别,这个同学们下来呢,就写一写,看一看啊,应该问题不大好接下来叫做用户的自定义函数,这个我们的小结啊,是我们比较重要的点,为什么呢?因为啊写个circle,其实我相信了,你们在后面的练习当中啊,会发现不难,但是能不能实现自己想要的结果,那这个就有点困难了,所以啊,我们有的时候是需要自己来写一些自定义的函数,那么自定义函数就分为弱类型和强类型,以及聚合函数,那这个同学们下来呢,要自己去看一看,比方说udf怎么写,Udf怎么写?那么udf又有弱类型强类型的区别?
10:13
这个下来呢,要好好看一看,一个叫ggreg,一个叫ggregator,这明显是两个截然不同的概念,和我们的这种类型对不对,这个要区分开啊,那么它的实现方式也稍微的有点变化,好了,行,接着往下啊,下面下面呢就是我们的这个了,来啊,我们的通用的保存和我们的这个加载了,这个通用的加载和保存对于我们大家来讲呢,其实关键要记住这么几个点,就是我们的通用方法read load啊,还有那个和save,一个是用Spark去读取,一个是用我们data frame去保存,因为data frame里面又有结构又有数据,它可以直接保存,而我们的这个SPA呢,它只能去读,对不对,这是它的区别。那么还有一个就是默认的这个格式是pack列式存储的这种格式,这个咱们也知道啊,就是不要误会了,到时候你加个form可以吗?对吧,那如果你要用到BC的话,你还需要一个把那些什配对吧。
11:14
示过的啊,呃,细节上我们不再的说了,那么这里还有一个叫做什么呢?叫做呃,我们的保存模式啊,默认的是get叫A,如果有存在相同的路径的话,会报错的,那么这里会有A呀,Overri呀和那个啊不同的这种取值,这个大家知道就行了,有个叫Mo,好,下面呢是还有Jason,还有那个叫CSV是吧,不同的这种文件格式作为不同的数据源,还有my circle,这个my circle啊对于我们来讲其实还好啊,我们只要把一些参数传对了,一般都是没有问题的。那么还有一个就是那个have,这个have呢,对于大家来讲呢,其实啊有点麻烦,是因为它有一个叫内置的和外置的区别,因为我们的Spark本身来自于have嘛,对不对,就Spark circle它来自于have,所以它多多少少呢,跟have是有一个集成的,所以呢,用一些特殊的语法的时候呢,Have呢会起作用,但是我们说了,我们如果用自己内置的have的话,一般都是用来做练习的,在工作当中一般是不会怎么用的,都是连接外置的have啊,那你要。
12:14
连接外字的have的话,那么我们的这个外字的have啊,我们应该怎么去连,我们这其实都是有步骤的,同学们这个呢下来呢,要好好的去看一看,把它写一写,只要能连上,那你后面就写S口文的问题了,对不对?好,这个咱们也不再去细说了啊,这个那大家能够把它连通就行了,然后后面呢,会有一个什么呢?我们的idea idea当中去连接我们的这个have,有这么几个步骤,第一个增加依赖关系,第二个呢,将have set呢,拷贝到我们的目录当中,并且在代码里面要启用have的支持,我们经常有同学啊,就是把这个地方就忘了写了,前面都没问题,就把这句话忘了写了,忘了写了以后就出现错误了啊,还有就是我们后面如果出现一些保存数据啊,出现错误的情况下,就跟权限有关系,你把这行代码放在我们的最开始,大家会发现咱们之前的代码在这个位置,其实每次都是放在我们最开始的,对不对啊,就是为了防止出现错误啊,所以这个呢,咱们了解一下就行了。那后。
13:14
那就是我们刚刚讲的项目实战啊,咱们是分了几个步骤,先把数据准备好,然后呢再把我们的文写好,然后呢去执行没有备注的那个,然后再增加备注,分了这么几步,希望呢大家把思路理解清楚,就是我们先做什么后做什么,那么当你们写程序的时候也要考虑到这几点好不好?同学们,OK,那咱们10SPA circle就讲到这儿了啊好。
我来说两句