00:00
好,接下来给大家讲离线推荐服务建设,那这两部分我们首先来讲的是统计,统计这一部分,首先它不是一个个性化的推荐,所有人我们看到的都是一样的,所以呢,我们肯定就是离线的跑一个任务,把我们关心的一些统计数据,统计指标收集起来,然后给出一个呃,对应的推荐列表放在那里是不是就可以了啊,这就是比较简单的一种思路,当然了,如果我们本身的数据发生变化之后,隔一段时间我们应该再去跑一次这个任务,把数据更新一下,列表更新一下,这个我们自然是可以想到的,在实际应用场景里边,我们可以去用像阿斯卡湾这样的一些呃,调度任务,调度工具啊,或者说你就自己去手动去起也是没问题,这些大家应该是都了解的。好,那么我们看一下离线统计服务,我们首先要来搭建这个框架啊,我们就还是在这个recommend下边去新建一个。
01:07
子模块瞄准。那么这个子模块就叫做统计推荐啊,Statistics。Recommend。呃,这个模块应该大家会想到跟data loader是并列的,都放在recommender下边。Finish一下。哦。然后大家看到在po文件里边,我们要去添加依赖了,大家可以想象一下,就是这个里边的依赖会用到什么呢?哦,大家会想到你既然是统计推荐嘛,那肯定Spark sparkle,这这是不是都要用啊啊,这些是肯定要用的啊,那我们就对应data loader本身之前写过的这个po文件,大家来对比一下吧,我们看一看哪些需要哪些不需要,呃,然后我们再。
02:02
有别的需要的往里加,不需要的删了就完事,好诶,这个SPA spaq是不是都需要啊,Sky library是不是也要啊,啊用到的一些东西啊,然后还有下面就是mongo了,Mongo的驱动,然后mongo Spark ne这些要不要?好大家想到对这一下我们不用去往mango里面写,呃,写出去其实最后我们也要统计推荐的结果,哎,当时我们想的还是写回到mango里面去,让业务系统方便读取,对吧?诶,所以那是不是读数据写数据都要用到跟mongo的连接,所以这里边其实是都需要的。哎,那我们再想一想,还需要别的东西吗?那个学习诶,呃,大家想到机器学习的那个库M不需要吗。这部分是统计,统计推荐,好像暂时跟机器学习还没关系,所以在这一部分其实大家会看到在文档里边啊,我们列出来的Spark sparkq,呃,Scla library,呃,KASPA,还有monggo Spark connector,是不是跟之前的这个data loader完全一样啊啊,所以大家如果要是一个一个都想清楚的话,我们就把它直接copy过来就可以了。
03:20
这个copy这个工作确实是非常的简单啊,但是我们一定要想清楚,抄这一下简单,但是我们应该想清楚到底为什么哪些要,哪些不要,这些我们是一个一个看过的,好,那接下来还是一样的,呃,这个方式啊,我们想到在resources下边是不是应该有一个log for g的配置文件。把它copy过来。呃,另外我们想到如果看到这一个原文件目录这个名字不爽的话,改个名skyla,接下来我们就可以在下边写我们的源代码了,还是一个sky class对吧?那大家会想到这个统计的这个模块,它应该是什么呢?
04:09
Classup还是treat?今天我去。大家会想到整个这个统统计推荐模块,我们是不是也是一个离线的任务,隔一段时间去执行一遍,执执行这个任务就可以,别的地方是不是应该不会去用它再去创建对应的对象啊,所以他是不是就应该是一个对还是一个单立对象啊,这个我们应该能想到啊,所以呃,接下来我们还是加上包名吧,com.at硅谷点啊,这个包名我们跟之前区分一下,这个就叫statistics。T,然后加上他自己本身的这个名字啊,S。Under。
05:02
好。现在我们又有了一个单例对象,那首先第一步还是先去想一想我们要什么样的样例类对吧?呃,方便我们做这一个数据结构的包装,那我们还是看一眼data load里边有什么样例类吧,这里边我们把基本的数据product商品和这个RA评分都做了一个阳梨类的包装,还有一个mango的连接配置阳梨类这里我们需要哪些呢?Product这个星期需要吗?大家可以回忆一下,正是跟我们的需求相关了,我们需求里边要做的几项统计,大家想我们要做这个热门统计对吧?历史热门统计,近期热门统计还要做这个,呃,就是优质商品的推荐,就是商品的平均评分统计,这些东西跟什么相关?是跟商品的信息相关,还是跟商品的评分相关?
06:04
对,我们当时说的热门是不是都是按照这个评分来算的评分个数来算的热门程度啊,所以商品本身的信息在我们这里反而不重要,所以我们是不是甚至都可以不去创建这样一个样例类啊,只需要这个评分的样例类就可以了。所以这里边我们把这一部分copy下来,我就不。一行一行去敲了,大家想清楚的话,我就直接把它copy过来。然后接下来大家会想到。跟mango那边还要去做读写的操作,是不是这个连接配置项还是应该有啊,所以我把这个mango的配置样一类也copy过来啊,这里边就没有把product再创建出来了啊,这是根据我们这个程序里边具体的需求来的啊。
07:00
呃,然后接下来我们就看这个。单例对象里面的主体内容了,之前的这种写法,我们是先去定义了一些表名,还有这个文件路径,这里不需要做文件的读取,当然就不需要文件路径了,那这些表我们用到哪个呢?哦,大家会想到是不是product,我们可能不用到对吧,最主要的就是RA,我们从这个评分表里边读取数据。然后。进行,呃,用SPACQ做一些统计的计算,最后得到结果还要再写回到。Mango里面去,呃,所以我们是不是还得定义一些我们最后写回去的那些表名啊,这里我们做一个定义啊,比方说呃,这个我们借鉴一下在文档里边的写法,这里边我们定义了三张表,一个叫做。呃,就是rate more product,这个大家随便给给名字啊,当然这个本身的这个名字呢,是我们在业务系统里边啊,就这么定义的,所以这里边就一样去沿用了啊,那大家可以看到这个more products是不是就相当于是评分更多的电影,呃,这个商品啊,评分更多的商品对吧?所以这就相当于代表了我们历史的热门统计,然后还有一个叫rate more recently products。
08:26
这个就代表了最近的对评分更多的商品,这就相当于是我们的近期热门统计,还有一个average products,当然这个少了一个词,应该是average score,就是平均评分啊,每一个商品的平均评分统计相当于是一个优质商品统计,对吧?啊,这个大家能想到,所以我这里边就直接把这几张表的名字copy过来了。啊,然后我们是不是就可以定义这个入口方法main函数了,呃,这里大家又可以去借鉴一下之前data loader里面的一些呃,一些写的方式啊,大家会想到在这里我是不是还应该,哎,首先定义一些这些配置的常量对吧?然后创建Spark con,创建Spark session,然后去加载数据,是不是也是这样的一个流程,所以在这个过程当中,我能抄就就直接超了啊,大家会在写代码的时候思路更清晰一些。
09:29
前面这个con大家需要去看一眼啊,这里边的con SPA要不要?啊,对,这个肯定是要的,因为我们创建这个SPA session肯定需要用到啊,然后mongo UI啊,这不是也也需要啊,还有mango DB,我们既然做这个mongo配置的时候就要的是这两项,所以这些三项我们都要保留下来,然后接下来我们继续看这个span f啊,这是一样的啊,这没什么问题,SPA set master这里注意set a name是不是要改一下。
10:02
啊,这里我们改成statistics。Recommender。呃,然后下面创建SPA,这是一样的,对不对,呃,这个该引入的东西同样引入进来,另外我们看看。接下来就是加载数据了。另外我们看看还有什么可以可以借鉴直接抄过来的呢?哦,最后我们经过统计之后,是不是还要把这个东西存到mango里面去啊,这里我们借鉴一下,还是用这个影视定义的这个配置参数在这里直接定义好就可以了。呃,这里我们不要去引这个recommend下边的网con,因为我们上面是不是已经自己定义了one con啊?呃,当然我们也可以直接引外边的这个包,但是我们到时候在打包的时候,它会有一些耦合关系,这个大家能想到吧?呃,所以我们就直接放在这里就好了,用自己内部定义好的。
11:04
好,接下来就是做这个加载数据这一步操作了,那这个数据我们主要是用什么数据来做统计分析呢?就是mango DB里边的对评分数据,是不是就是从这个RA表里边,昨天我们做了data load之后,RA表里边已经有数了,哎,所以我们直接从里面读出来,再去做一个计算啊就可以了。所以呃,这里边我们想要最后得到的东西就把它转成一个就是data frame吧,因为我们要用这个SPA去做各种各样的统计计算,对吧?最后再写回到呃,Mongo里面去的时候,我们还可以调用data frame的writer,呃,它写一个这个data frame writer,把它直接save就可以了,这个是我们比较熟悉的方式,所以这里边就定义一个RADF。
12:00
那这里边给大家介绍一下Spark session里边有一个read的方法,大家如果要是感兴趣的话,也可以在我们这里给大家,呃,讲到的这些文档里边大家可以看啊,就是怎么样去读取数据啊,这些我们就不详细说了,大家可以自己去翻文档,SPA session的read方法里边同样也可以在这里啊,指定option啊,那这里边比方说跟mongo的这个连接的uri是不是一样,去去指定啊mango con.uri。然后还可以指令什么呢。是不是要指定collection名字啊,操作的这个表的名字,这里我们操作的是哪张表?呃,就是前面定义好的,大家看这个跟之前那个呃,Mango就是data frame writer的那个,就是配置的那个写法是不是一样啊,对,很像啊,当然它会有所不同,当时我们两个option之后,是不是接下来是mode overri呀,那大家会想到你读取的时候要不要overri啊,这显然就没有这个这个呃,配置项了啊,所以接下来我们直接就是format。
13:19
还是com.mango DB。spark.cq。最后我们调取的不是save,而是一个漏方法,就可以把数据加载进来,大家看这个过程其实还是非常简单的啊,只要我们熟悉这种这种模式,这种写法,就直接可以把它读进来了。接下来我们想要,呃,这里读进来之后,其实是就是mango本身的那个数据,我们这里其实是想把它换装成已经定义好的样例类,所以还可以把它再做一个as操作。直接把它转成我们定义好的数据结构。
14:03
啊,大家可以看到啊,那当然了,就是大家可以想到这个as返回来的到底是个什么呢?呃,这是变成了一个data set对吧?所以其实我们如果想要在这里边再去做一个转换的话,你也可以再去to data frame,其实是直接用data set也是可以做的啊呃,大家如果我们前面已经定义了data frame的话,你再去涂data frame也是可以的。好,已经有了这个data frame的话,我们是不是应该创建一张临时表,然后供之后我们的Spark CQ直接写select from供他去做做这个呃,CQ的。直接往里面写写东西了,对吧?呃,所以接下来我们去定义一个创建一张。叫ratings的临时表,那创建临时表的时候,大家之前应该接触过data frame,是不是有一个方法叫做对create or replace temple view,对吧?啊,就是我们说是一般说是把它叫做临时表,其实应该是叫做一个临时视图,一个view啊呃,那么大家可以看到这里边定义好这个叫做ratings,这是不是我们在PPT里边给大家是讲过方法,就是就是这么去写啊。
15:31
大家看这个历史热门统计,这里面是不是就直接count from ratings,呃,对,这这里面并不是我们的data frame,所以我们要把它转成一个叫做ratings的temple view。好了,那这一部分临时表已经有了,接下来就是我们写一个土豆吧,要做什么事情呢?呃,就是要做对用。Spark CQ,写这个CQ去。
16:04
做不同的统计推荐。呃,那这里其实可以写一下啊,第一个我们需要的是历史热门商品,这里面我们主要的方法是什么呢。是按照平分个数。来选取的对不对啊,统计按照评分个数来统计,第二个我们做的是什么呢?近期热门商品。啊,这也是按照这个评分个数来统计的,只不过我们会加上那个时间戳的影响,对吧?诶,当时我们的思路是怎么样的呢?回忆一下,对,按照年月来做一个统计,所以我们会自定义一个,呃,就是定义一个udf啊,做一个转换,把它转换成YYYYMM这样的一个年月格式啊,所以这里边是。
17:08
把。时间戳对转换成YYYYMM年月格式进行统计,评分个数统计。然后最后一个还有呃,就是我们所谓的优质商品对吧,商品统计这个主要就是看商品的平均评分。这是我们的这要做的三三部分啊,三三个模块,最后做完之后是不是就Spark点。Stop就完事了啊,当然这里边每一次统计完了之后,我们应该把它是不是要写入到mango里面去啊,啊对,这里边我们就还是把这个写入到mango的这个方法呢,提成一个方法,这个跟data loader这边我们弄成不一样的方式吧,因为data loader这里边我们相当于是同时把要写的这个data frame全传进去,一次把它写完了,更好的方式应该是什么呢?应该是对,我们要写哪个数据,是不是传哪个数据啊,然后我们定义成一个就是,呃,相当于是一个统一的方法,一个写入的方法,所以这里边我们做一个这样的实现。
我来说两句