00:00
那接下来我们真正可以码代码了,我们码代码的时候是不是先要看一下代码放在哪对不对?我们的代码是不是应该在data loader source main下边,是不是在这个Java下边啊,大家如果要是觉得不舒服的话,我们这是个skyla项目对不对?我们是不是可以给他改个名啊,好,改名改成skyla,那大家可能会想,我改名之后,这个还是我的原文件目录吗?还是source file吗?呃呃,那个。呃,Source folder吗?我们是不是可以看一下project structure啊,大家点开看一下,大家看source folders,诶,这里还是source main sc对吧?啊,下面还有我们对应的这个test folder,还有这个resource folder,这些都没变,所以这些如果我们要想改变的话,可以在这里指定对不对?呃,你在这里可以就是点到这里直接在这里mark as一点,是不是我们的这个idea里边命文项目就认为它是一个原文件目录啊啊大这这个大家稍微注意一下就行,应该之前是讲过的吧,讲过是吧?好,就给大家再简单的复习一下,然后诶,大家会看到我们这里还有一个resources文件夹,它是不是需要放一些我们的资源文件啊,那还有一些配置文件往往也是放在这儿的,对不对?那大家会想到我们既然是data loader,那是不是这个resources下面至少得有我们原始数据,是不是现在拿过来啊,哎。
01:29
所以那原始数据放在哪呢?哎,大家看我已经放在这个桌面了,我把它复制一下,复制过来OK。哎,大家看拿过来之后,这就是我们的这三个数据文件对不对,然后另外在resources下面还得去有一个什么东西呢?呃,大家可能会想到之前我们用这个log for g是不是需要定义一个properties文件,配置好了之后它才能生效啊,那这里边需要什么东西呢?我们去看一眼啊,这这是先是数据集的一个分析,我们就不看了啊。
02:06
日志管理配置文件,我们把这个先copy过来。这里就做了log for g相关的一些配置,大家看这个root logger,这个infer,这代表什么呢?对,这是不是输出的日志的信息级别啊,这里是infer的话,那就是所有的infer都会输出,Infer以上都会输出,如果说大家看着那个日志太多内容不想看的话,是不是可以把这改成对W或者error对不对啊,这个大家都是知道的啊,然后后面定义了一个std out,那么大家看这个s TD out是什么呢?啊,标准输出它定义成是不是控制台输出啊,所以在我们这个程序里边,就是在控制台直接把log都打出来就可以了啊。那呃,接下来我们还有一些这个layout的展示的一些,这个就是样式的设置,大家看这这是时间对不对?然后还有一些显示的形式,呃,这里都定义好了,大家只要知道就可以了。好,做了这么多工作,我们终于可以开始进入核心的。
03:11
代码了对吧?Skyla下边是不是去创建一个类啊,哎,创建什么类啊,应该是skyla class对不对?那么这里边我们大家会想到,对,我们这里是不是一个就是离线的一个程序,这就应该是一个单立对象对不对?呃,大家看这里我们选一个object对吧?那么它这个名称我们叫什么呢?就叫data loader吧,然后我们一般的习惯是不是前面应该要加上它的那个包名啊,呃,所以我们这里边这个包名定义还是要这个反向的这个呃,域名对不对?Com点爱硅谷点这recommender放在下面,然后data loader大家知道可以直接这么写对不对,我直接这么连着写的话,加入进来之后,这个包名是不是自然就在这里了,然后我创建出来这是一个叫做data loader的object,呃,这样的一个单一对象。好,那接下来我们是。
04:11
不是就可以去,大家会想到我们是不是先要去考察一下我们的这个数据是什么形式啊?呃,那大家会想到我既然是要把这个数据读出来,然后要往mango里边和ES里面去写,然后最后是要用这个SPACQ去写的,对吧?那我是不是得定义一些样例类,指定它的这个sIgMa呀?是不是得把这个表结构的定义出来啊,要不然你到时候怎么写呢,你都不知道字段,我们这里边拿出来的这些东西是不是是不是只有值啊,你根本不知道字段对不对,呃,所以我们一开始先考虑到的就是先去定义一些样例类对吧?好,那大家会想到我定义什么样例类呢?Case class。首先大家想到是不是这个,哎,我们有什么数据,是不是应该先把它读进来,对应的那个数据一个一个字段都提取出来啊,那这就是一个样例类对不对?所以我们定义它不是有movie吗?我们定义一个movie的样例类对不对?然后case class,大家会想到还有什么RA对吧,还有什么tag对吧?好,这就是我们一开始想到的三个样例类,那这样的这个呃,样例类大家会想到这个。
05:40
到底怎么去定义它里边的字段呢?啊,这个我们就得从这个数据里面去找了,对不对?大家先瞄一眼,这这这个数据好长啊,好复杂,大家大概一看它是用什么分割开的字段名啊,是不是用逗号吗?大家看一眼,这里有逗号,但是这里是march,呃,Twenty,这是3月20号,后面2001,这是不是应该是一个字符串啊对吧?这是表示时间对不对,一个字符串真正分割的是不是这个上间号啊啊,所以这个还比较特殊一点啊,那我们找一个大看这个有些上千号中间是不是没东西啊?呃,我们说到那个,它那个详情有些没有啊,我找一个有详情的吧,我记得,呃,大家看这个260行啊,这个star wars,这是不是星球大战啊,对吧?这个里边是不是后边这个有它的详情啊,那这个这一行就会非常非常长。
06:40
我把它copy下来再看,别的都没他这么长啊,我先放在这里啊,给大家写一下这个movie数据集,我们把这一行数据copy在这里。呃,那大家会想到我这里是不是要按照这个上间号把它做一个,呃,做一个切分啊,对吧?好,那么我这里就先把它做这样的一个处理吧,回车回下来对不对。
07:12
然后大家看,我可以一行一行把它全回下来,好,没有了,总共有几个字段呢?实际上。大家看起来好像是有九个字,诶九个字段吗?我我记得好像应该是有十个字段的啊,看一眼这个难道难道我们直接找过来大家看一眼啊,三四五六七八九十,诶,应该是十个字段看一眼啊哦,这个我估计是前面我们放上间号的时候可能有点问题啊,哪里少了一个对不对哦,大家看这里是不是有一个好像没有把它弄出来对吧。回车,回车。
08:04
好,现在没有了,大家看一眼现在是多少个,哎,现在是十个,对了啊啊,当然大家会想到这个,后面这个内容太长,我们把它删掉吧。呃,我就是查找完了之后,大家知道F3可以可以去跳到下一个对不对,跳到下一个,然后我把它直接转成回车就可以,那这里大家就会想到第一个是个什么东西呢?这是不是电影ID啊对不对,那我们定义一个是不是可以定义成叫mid,然后下边这个是什么呢?这是电影名称对吧?电影名称我们给一个name对不对?哎,我怎么总习惯性的给一个第三个,这是一个详情对吧?呃,详情描述呃,这个我们,呃大大家可以看到这里面都有都有定义对不对,我们这个尽量用这里定义好的,为什么呢?就是到这个表里边去做查询的时候,有可能业务系统用的就是这个名字,对不对啊,所以我们这里就用一样的就好,这本来是不太重要的啊。
09:17
这个时大家看这是一个时间120分钟对不对,时长对吧,那这个是叫它定义的叫timelo,好,然后下边这个是拍摄时间,对。呃,这个是叫shoot对吧。我们看一眼下面还有啊,不是这个是发行时间一宿对吧,下面一个才是shoot发行时间。诶,大家看他这个好像数据有点问题,是不是发行时间是2004年,下边的这个拍摄时间是七七年,所以可能这个数据它收集的时候信息有点问题,是什么呢?这个星球大战他可能认为这个拍摄时间是第一步的时间,对吧?然后大家看这是不是已经是第第四步了,对不对啊,后边这给的是不是第一部对吧?七七年好拍摄时间shoot,那同样下边的这个大家看这是语言对吧?呃,Language。
10:26
下面这是什么?这是我们想要的最重要的那个电影的信息,对不对?类型,呃,这里边我们用Rogers这个这个种类类型这个来设置啊,然后这里是什么演员表对吧?呃,Acts,最后还有一个乔治卢卡斯,这是什么导演对吧?Director,呃,Direct director还是directors directors有个S对吧?好,所以大家看我们如果把它分析一下的话,这十个字段是不是就是我们应该定义在movie这里边的东西啊?那大家会想到这个mid应该是一个什么数据类型,Skyla是强数据类型的对吧?它应该是什么?Int对不对?那剩下的name describe这些应该是什么?大家看剩下的这些是不是全应。
11:26
String啊,除了这个拍摄时间有可能是一个只是一个年份,但是万一他要也也像上面这样有这个月日的话,是不是也应该是一个string啊,那所以我们为了预这个以防万一啊,就是下面的全用string是不是就没事了?好,那大家看到这里边的定义都已经在这里边写出来了,我这里边就直接粘了啊,大家可以就是还是手敲一下好,呃,这是这部分内容string。好,然后我们已经把这一部分弄出来之后,下边的这个rating和tag其实就非常简单了,我们看一眼rating是长什么样,大家看它是逗号分割的一组数据对不对,那么这一组数据数据集这一组数据其实很简单,是不是就是一个,第一个是什么用户ID,谁给谁评分对不对?用户ID,然后是不是电影ID啊,他对哪个电影评的分对不对,接下来是不是一个评分,最后还有一个时间戳啊,那那那家想一下就是这几个我们是不是定义就是,呃,第一个是用户ID对吧?UID它应该是什么类型。
12:52
String吗?UID是string吗?大家看这里边的UID是不是全是一个数啊,跟midd是不是一样的呀?所以我们这里边的UID也是一个int,那同样mid是不是也是一个int啊?接下来是一个score对不对?这个score应该是什么啊?大家会想到这应该是一个double对不对?我们用一个double类型来做一个保存,最后还有一个时间戳time step。
13:24
它是一个什么类型。大家看一下,大家大家看一下它它这个这个到底有多大,大家可能会想这个到底超出int范围没有,对不对,大家看这个一共有几位啊,四位,四位是不是十位啊,十位是不是表示12亿多啊int的大家回忆一下int是多少位的这个数据。Int是多少位?Int是32位对吧?所以int是有符号还是无符号有符号的,所以它是不是应该是正负,如果是32位的话,大概是应该是多大一个数,然后给大家算一下,正负的话相当于得少一半对不对?呃,那就是相当于31位的一个数对不对?31位的一个数,大家知道二的31次方对不对?二的十次方是多少?不知道二的十次方10241K对不对?二的20次方是多少?
14:35
1024对,是不是就是1024的平方就是就是一兆对不对?1K的平方1K乘1K是不是一兆啊?二的34是多少?是不是就是1G啊,是不是这样,1G是不是就是。1G是多少?10亿对吧?1G是不是G是十后面九个零,一后面九个零对不对啊,但一下子反应不过来了,对吧?啊好,所以呃,就是它应该是一后面九个零,那就是10亿,那所以31次方,那是不是21啊对吧?31次方应该是三,30次方再乘以二对不对,所以是21 21是不是比它大要大,对所以大家看是不是我这里边直接int也够啊呃,所以大家稍微的注意一下啊,就是我们在这里边,当然大家如果想把这个数据类型定义成long的话,是不是也可以啊,所以我们这里边是直接把它定义成int了啊,大家看一下这个数据类型,你至少是要去考量一下的,对不对,不是随便随便说它就应该是一个什么样子啊呃,当然了,类似大家会看到tag是不是跟这个rating非常接近啊,只不过就是。
15:53
只不过就是什么呢,把里边的score这个评分要改成要改成什么。
16:06
是不是要改成一个一个字符串作为一个标签啊,好,所以这是这部分内容啊,那我这里边就直接把这个copy过来,大家看一眼,是不是u ID midd,还有time STEM完全一样,最后多的一个是不是就是这个ta这个值啊,这是一个string对不对啊,所以其实就是这样,但。
我来说两句