00:00
好,接下来我们就真正可以开始写代码了,然后在写代码之前,我们这不是data loader要加载数据吗?还缺什么呀?是不是还缺数据文件?对,大家不要忘记这个我们还应该有数据文件,我这里边把这两个文件已经放在这里了,大家会想到是不是可以把它放在这个resources目录下边啊,这这是我们能想到的一个常规操作啊,把它放到resources下边。OK,好,我们把对应的数据文件先copy到resources下边,然后大家会看到这里边的这个RA ratings长什么样呢?是不是就是逗号分割的这个四个数据啊,然后另外还有一个products,呃,这个看起来就复杂一点,它的分割符不一样,它的分割符是什么呢?对,它是个上限号分割的,所以我们到时候得用上限号去做处理啊,这些我们到时候写代码的时候具体再来做啊,好,然后另外还有一个准备工作,就是resources里面还需要加入一个什么东西呢?我们去创建一个对,就是log for g的pro文件,这个大家可能知道,就是我们需要去对log for g做一些配置,然后它才能生效,这里边我们直接从文档里面copy就好了。
01:25
呃,这里。日志管理配置文件。大家应该看得懂这些配置项吧,前面的这个root log等于infer s TD out,这是什么呢?Iner指的是什么?对,日志级别对吧?啊,我们输出的是iner级别,大家如果要是觉得那个iner满屏的iner输出不爽的话,可以更改,呃,可以改成war对吧,改成警告,呃,那这里std out,这是不是就相当于我们定义了一个标准输出啊对,这里边我们的输出就是控制台对吧?直接输出到这个控制台里边来,然后我们还可以定义一些输出的样式,比方说这里边是不是有一些这个时间的格式啊?呃,这个大家应该都看得懂,有了这些内容之后,接下来就可以真正的去写我们的代码了,SKY代码了,我们再。
02:23
SC目录下边去new一个,是不是要new一个scalela class?大家应该能想到对吧?诶,这里面大家注意我们class是应该去去选一个什么样的呢?Data loader,它应该是一个class还是一个object还是一个treat呢?哦,对,大家能想到我们应该是一个单立对象对吧?呃,就是在别的地方其实就不会调用这个类了,不会去,呃,就是再去生成它的对象了,我们其实就跑一遍就完事,这是一个标准的单利对象,这里边我们给一个名称吧,这个我们就叫data loader好了,这里注意我们可能一般习惯是要加上包名的,呃,所以我们是不是在定义的时候直接把包名加上就可以啊对吧?com.at硅谷。
03:10
点呃,Recommend这里边我们往往会把它外层的这一个做一个倒叙。Data loader啊,我们就生成了这样的一个单例对象啊,当然了,上面这有一些注释啊,大家可以看到,然后接下来我们是不是先得分析一下数据啊啊,我们先看一看这个数据长什么样吧。我去复制一条这个project数据过来。哦,大家看这个特别特别的长,那我把它做一个截取吧,它的分割符我们已经看出来了,是上间号啊,那我就根据这个把它。
04:01
呃,我们把它一行一行放下来啊。诶就是这些,然后这个有点太长了,我把后面就直接删掉好了。大家知道是什么东西就可以了啊。那么像这里的第一项,大家能想到这是什么呢?对,这是商品的ID,呃,这里边我都给大家说一下,这是product数据集,对不对?呃,第二个是什么呢?对,这其实是商品名称,尽管刚才我们看到它很长,但其实它都是包含在名称这一列里面的。第三个,这个可能大家看不懂这是什么东西,这是本身这个数据集里边有的商品分类ID,那大家会想到这个对于我们来讲好像没什么用,对吧?呃,这个是完全没用的,那我们这个不需要,然后接下来这又是个什么东西呢?呃,因为我们本身的这个数据是中文亚马逊里边的一些真实数据,所以这是亚马逊ID,这里也不需要,对吧,这个。
05:16
这个大家能想到,这是不需要的。呃,然后这个。大家已经看出来了,这是不是商品的图片URL啊,对吧?呃,这个是能够看出来的,这一项是什么呢?外设产品鼠标对商品的分类。最后这个是什么?对,这是商品的,不是评价,对UGC标签对吧,用户给生成的标签,好,这就是呃,我们能看到的这个product数据集,那大家看到这些东西之后,是不是想到我应该从这个文件里边把它对,把它一个一个都拿出来,最后是不是应该存到mango里面去啊。
06:07
那所以我这里边是不是应该有一个对应的数据结构,把这一项一项都做一个存储,最后诶把对应的这个数据结构存到猫里面就可以了,所以对大家已经想到了,我们一开始是不是定义一个样例类case class。呃,相当于就是我们先要知道本身这个表的STEM,它的结构是什么样的,对不对?好,那么case class这里就叫做product好了。我们看一下需要什么东西呢?第一个是不是product ID,这个是需要的吧,他应该是一个什么数据类型啊,大家会看到如果就是这样的一个类型的话,这是不是用一个int就搞定了呀?啊,我们还是看一眼吧,在这里。
07:00
啊,大家看这个数据量并不大啊。呃,这里面选取的只有90多个,100个左右,这里就是最大,这么大的话,那是不是int肯定可以搞定,是不是没有问题啊,所以ID直接用T来表示好,然后大家会想到接下来这个name是不是也是需要的,这当然是一个string了,没问题。接下来我们说这个分类ID是不是不需要啊,那我就不要定义它了,亚马逊ID也不需要,那这个URL我们这里可能不需要,但是为了和业务系统相关联,业务系统里面大家会想到这个ID是这个URL是不是很需要啊,因为你得展示给前端去读取出它的URL才能去展示图片嘛,所以这个还是需要的,我们这里定义一个呃,就叫做image URL,它也是一个string。接下来商品分类啊,它也是有必要的啊,叫category。
08:05
Grace three,因为大家看到它是用竖线分割的一组,这个呃,种类对不对,所以这个大家是需要把它分开的啊,然后接下来最后还有一个用户生成的标签text,这是不是也是string啊,这就是我们基本的这个样例类。对应到product的每一条数据里面去,那同样我们还有一个什么数据呢。是不是还有一个评分数据啊,也就是这里边的这个RA,好,我把这个copy调过来,呃,这里是叫RA数据集。呃,那这里比较简单了,其实就是逗号做分割对不对。
09:00
好,那大家能想到第一个应该是什么?我们之前说过,每一个评分是不是应该是一个用户对一个商品给了一个分数,然后一个时间除二,所以其实第一个数据就是用户ID对,第二个数据是商品ID,第三个是对评分数据对吧,第四个是时间戳。啊,所以呃,这个。大家已经可以看到它到底是什么样的一个数据结构。那同样我们可以用一个case class来。定义对应的一个case class。第一个数据应该是什么呢?啊,那这里就是user ID了,对吧?呃,这里这里大家注意啊,我们看一眼这个。
10:00
应该是RA这里啊,应该是谁对谁呢。看一眼这个。在这个products里面是不是有这个D啊,我查询一下。诶,好像没有这个。哦,刚才我们选的这个是user ID对吧,后面这个如果有的话,这就对了。哦,有,所以前面那个是user ID,后边那个是product ID,对不对,好,所以这里边我们的数据就是user ID。然后它是一个int对吧。然后下边是说product ID也是一个int商品ID,下面是评分,评分我们叫score,它应该是一个什么?呃,按照这样的一个数据格式的话,这当然是应该应该是一个double了,对吧,Double。
11:00
好,那最后还应该有一个时间,戳time STEM。来看一下这个time step应该给多少啊?应该给什么数据类型啊,大家回忆一下就是int,它的长度是int是多少倍啊?32位,所以相当于是应该是从呃多大的这个数据范围内呢?它是有符号还是无符号的有符号,所以说相当于是呃,大家会想到这个三三十二次,相当于是四乘以30次二的30次,对吧。是不是四乘以二的30次,所以是多少,是4G对不对。二的14是1K2的20次是。
12:01
对吧?HG大家没有没有直观的数据概念吗?对吧?二的十次是1K1024对不对?那二的20次是不是10K,二的十次乘二的十次就是二的20次是不是十,是不是一兆啊,二的30次呢就是1G对吧?所以那么二的32次是不是四个G。所以如果是它带有符号的话,是不是应该是正负。嗯。正负两个G啊,是不是这样有符号吗?大家想一想,是不是相当于减了一半啊,大概就是正负两个G的这个范围,那大家想象一下正负两个G应该是多少?这是不是,是不是后面九个零啊。1G是是不是一后面九个零是吧,1K是三个零,然后一兆是六个零,1G是九个零,所以这里边看起来它是不是还是处在我们的这个范围内啊。
13:08
是不是这样,还处在这个ins的范围内,对吧?啊,所以当然这里边我们可以把它定义成了,但是这里大家其实应该有这个概念啊,就是。Int类型其实是正负两个G,也就是正负20亿,大概是这个整数范围,所以对于我们这里的这个时间戳来说,其实是可以搞的定的啊,那所以这里边我可以给int也可以给了,我就故意就给就给int了,呃,大家应该能够搞清楚这里为什么要给int。就是本身的数据范围是涵盖的,好,接下来已经有了这个样例类之后,我们就可以去写这个主程序的基本流程了,那在这里边我们去写一个may。大家能想到我们应该是,呃,我们要用这个呃,Spark session的对应的这个读写方法对吧?呃,所以我们是不是肯定要定义一个Spark session啊,创建一个Spark Spark session,那么在创建之前,我们是不是先要去创建一个Spark Spark的con对配置项啊,这里边我们先把它控制吧,我们先大概的这个框架写出来,然后下边肯定要创建一个Spark session对吧?我这里边就把它叫Spark吧。
14:28
有了这两项之后,接下来是不是就可以去加载数据了,加载数据呃,那么加载数据的时候,我们可以把这个product最候把它加载成一个RDD啊,因为如果我们要用SPA session里边的呃,这个test file方法的话,那可能拿过来之后就是一个RDD对吧?那最后我们要存入,想存data frame的话,我们再去做转换,诶这里边先定义一个RDD,然后呃,对应的这个RA也有一个RDD,先把这个框架搭好。
15:09
如果把这些东西都已经拿到,是不是再把它直接数据store data in mango DB就可以了,我们定义这样一个函数,把它存进去就可以了,对吧?啊,最后做完了Spark点。Stop,对,哎,这样就完事了,这就是我们整体的这个框架,当然了,我们这里边应该要去定义一个这个函数,诶,我们先把它放到这里,大家看着这个报错不爽的话,我们把它先注掉,这就是我们整体的框架。所以其实整体框架还是非常简单的。
我来说两句