00:00
我们现在已经实现了基本的程序框架,那接下来其实就是一步一步把它填充完整了,呃,那首先为了这个代码的规范化,我们再加入一个样一类,呃,这个主要是出于什么考虑呢?我们后面不是要对mango有相关的操作吗?啊,那这个mongo的配置,我们把它封装成一个样例,样例类后面使用的时候更加规范,所以这里边定义一个叫做mon mango。Conig的样题类,那大家能想到我们跟mango的连接需要什么东西呢?呃,是不是需要uri啊,对吧,这个是需要有的,给一个uri,另外可能还会需要指定一个DB啊,当然就是说DB可以放在这个uri里边,我们这里边就是把它分开写了,如果有别的参数,我们还可以在这个样例类里边加别的字段,这个大家是能够想到的,对吧?好,有了这个,呃,这里还是大概的写一下吧。
01:09
呃,这里边是一个mango DB。连接配置。这是mango。DB的。UI下边这是要操作的DB对吧。好,这是我们的程序规范化的一些写法,然后接下来我们在main函数里边还可以去定义一些基本的配置参数啊,这就属于我们这个可选的一些配置参数了,Con。定义一个map。大家会想到我们有可能会用到什么东西呢?呃,比方说spark.course。
02:07
我们去定义一个,定义一个什么呢?Local芯,这个大家知道是什么意思吧,呃,对,这个是就是我们要启用这个本地多线程,那就有有所有的逻辑盒全部占用对吧?呃,在做这个,呃,大数据计算的时候,那么接下来我们再定义一个mango相关的东西,mango.uri。呃,这里就mongo DB,对于我的环境来说,直接就是local host,大家根据自己的环境来去写这里的基本配置,27017。呃,当然,我可以直接指定我要的DB,后面加上写稿,也可以用下面的那个DB来指定也可以,对不对,我这里就叫做recommend,我们的DB名称就叫做recommend,下边还会有mango.db。
03:09
Recommend。呃,先把这些基本的东西先定义好。这是一些配置选项了啊,然后接下来就是按照之前我们的这个步骤一步一步实现了,对吧,这是创建一个Spark。然后下边是。创建Spark。那么创建Spark的时候new大家还记得吧,Spark对con,呃,然后里后边需要去是不是set master啊。那么masterster我们这里边传什么呢?是不是直接用config里边的Spark点就可以了啊,这前面定义好的话,这里就方便一点,不要去写死对吧,我们统一在上面定义。
04:11
然后还有什么,呃,对,在APP内一般我们的写法这里就写死好了,因为对于我们不同的程序来讲,这里都是不一样的,Data loader就叫这个名字就好了。好,这是我们基本的这个Spark,然后Spark session怎么去创建呢?呃,那我们要用Spark session。对,点是不是builder啊啊,调用builder方法,那么它的config选项点config config放进去SPA conig。然后一般我们会有一个是不是get or create啊,就是如果有的话直接拿来用,没有的话新建一个,这样我们就得到了一个呃,Spark session,然后接下来就是加载数据了,在加载数据之前,我们一般会引入一个包。
05:07
因为大家知道如果要去做这个,呃,Data frame,还有data set的很多操作的话,是不是都会依赖一个Spark里边的这个implic implicit这个影视这个包啊,所以我们把它先引入。啊啊,然后接下来我们是不是就可以去加载数据了,加载数据的时候,我们是从文件里面加载,那是不是这地方我们还得去定义什么呀。我们还得去定义文件路径,要不然你从哪里去加载呢?呃,所以呃,这里为了我们不要直接写死,我们还是在前面定义一些常量好了啊,这些常量啊,这个不要放在这里面,我们直接放在外面吧。比方说这里定义一个叫做。Product。
06:00
Data pass。那这个路径是什么呢?就是我们这里的路径。可以去copy一下,Pass。我们直接粘贴过来,大家看到,呃,自动的就把我们这一个里边的斜杠加了,加上了转移,对吧,呃,就是变成了反斜杠,Windows下边的这个路径格式好,所以。接下来我们还是同样去定义一下,呃,这个RA。Data pass。把它copy一下。放过来,接下来我们去加载数据的时候,是不是就直接可以从这个路径里面去加载了,呃,大家知道在呃SC里边是不是有一个t type的file这样一个一个方法啊,可以直接从我们文件里边加载数据,把它加载成RDD对吧?所以这就很符合我们的要求了,所以在这里,呃,那这个SC是不是已经封装在了Spark里边,Spark session里面。
07:16
呃,这个大家知道对吧,Spark contacta。我们调取他的text file这个方法,这里边要传入一个文件路径,这里边我们用product data pass传进来就可以得到这个RDD,这这个大家是知道的,它这里的返回是一个RDD,对不对,好。然后接下来我们最后想要把这个数据存到mango里边,那我们其实是希望他有固定的这个表结构的,对吧,所以我们想把它转成一个data frame。这里就再定义一个product df。那就要把前面的RDD转成转成data frame了,怎么转呢?这个其实呃,当然大家会想到你直接那个to df不就完了吗?我我们还得先做一些基本的转换是不是?呃,并不是直接无脑转转过来的,那大家会想到之前的这个所有的数据我们加载进来之后,一条数据还是一长串那个上千号分割呢,对吧,所以这里边。
08:25
需要先去做一个map操作。大家想一下,我们这个map操作首先要做的是什么?对,首先要做切分,所以我们先拿到这个。每一个数据对不对,对吧,这里面就做这样的一个转换了,那对于它的每一个item,我们先做一个切分item.split对吧?这里边切分的字段是什么呢?对,是上间号。
09:00
上间号这里大家需要注意,呃,对于我们这个Li,如果要是按照这个呃对正则的这个表达来看的话,上间号是不是应该做转移啊,那做转移的时候是直接这么转移就可以了吗?对,大家注意,因为本身在正则里边是不是反斜杠也应该做转移啊,所以我们要用双对双反斜杠,然后来做转移,前一个反斜杠表示的是转移,后边这个反斜杠对不对,所以两个反斜杠表示的是一个反斜杠,那这一个反斜杠再加上接号上间号,表示把上间号进行转移啊,这个大家应该熟悉啊,正则的一个表示,那接下来。这里边给一个注释吧,大家能看懂吧,应该呃,Product数据通过上号分割。
10:03
呃,所以我们把它做一个切分对吧。切分出来。然后接下来我们把它转换成是不是转换成product类啊,大家想我们是不是前面定义了class case class就是就是用做这个事情的啊,把它转换成我们标准的样一类,然后返回是不是就可以了。Product,这这个写法大家知道吧,对,这个SKY拉里面的写法,我们在这里边最后一行就代表我们前面这一个返回,对不对,整个这个代码段的返回,好,那么这里边我们要的是什么呢?Attribute的零就是ID,那这里要注意前面SP之后应该是一个string,对,这里要去对,是不是要to in啊,然后接下来我们第二项是什么来着?
11:06
第二项是商品名称,然后大家会看到,也就是说零一这两项是要的,二三是不是不要啊,然后是456都需要,然后商品名称,还有这个URL,还有商品分类和标签,是不是后面都是string啊,所以我们就是二三不要把其他的拿出来就可以,那是attribute的一,这是一个string,我们可以做一个,是不是可以做一个tri操作,这是干什么?对去首尾的那个空格,对吧,把它做一个处理,然后这里我就直接复制了啊。二三好五项对吧,中间的二三不要,后边是456。诶,这就是我们包装好的product这样的一个类,对吧,最后得到的结果是不是我们想要data frame的话,用一个to df把它转换成对应的data frame就可以了,同样RA,呃,这里好像我们都不用就是。
12:19
再详细说了,对吧,SC里边的text file,我们这里要用到的是RA data pass,呃,那大家会想到下边这个是不是都类似啊?哎,对,都一样,我还是敲一遍吧,RADF。里边的什么会不一样啊,不是product啊,不要照抄。里边的什么不一样啊?样例类的那个写法不一样,还有什么不一样呢?这里边是不是切分的过程也不太一样啊,大家还记得我们的那个评分数据,它是用什么切分的吗?对,大家会想到之前的这个是用逗号切分的。
13:08
哦,这里面已经切开了,所以大家看不到了啊,那逗号需要去做转移吗?逗号就不用做转移了,对吧?所以这个接下来我们把它包装成RARA里边有四项,那第一项是。哎,是user ID是不是得to它,然后接下来第二项。是product ID,商品ID是不是也得to?好,第三项。啊,第三项是评分,对attribute。二那它是一个什么数据类型来着?对,是double,我们要to double,最后一个三是time step,我们当时是把它定义成了int,所以这里是不是还要to int啊?哎,这样就把它做完了,最后还是to df就可以了。
14:10
好,呃,那。接下来我们像已经有了这些数据,最后其实就是把它存到呃mango里边就可以了,我们这里面要存的话,这个方法需要去传进什么参数呢?是不是就是把我们要存的数据传进去就可以啊,那这里边已经有的product df,还有一个叫RADF,把它传进去就可以了,大家会想到另外似乎是不是还应该,你既然是要对mango做操作,我是不是应该把。对mango的连接配置也传进去啊,这里边还得做一个传递,诶这里边呢,我们用另外一种写法,我不想在这个调用函数的时候,每因为我这里边这里是只用了一次存了一次,假如说我有很多地方都要去存数据的话,我是不是不想每一次都把芒果的连接配置都传一遍啊。
15:06
呃,那可以怎么做呢?我可以定义一个影视的配置参数,影视的配置对象。Implicit定义这样的一个monggo conig,那么他应该是什么样的数据类型,是不是就是我们定义好的这个mango conig压力类,它里边的内容就是一个uri,一个DB,这是不是都在con里边已经写好了mango.uri。还有一个是config里边的mango.db是不是这样啊,大家看就是具体的这个具体的值,我们是在perfect里边已经写好了的,然后呢,我们在用定义好的样例类规范的把它包装起来,定义这样的一个影视配置对象。好,那接下来我们是不是就是把这个实现就可以了,实。
我来说两句