00:00
好,那下面一部分是做一个数据源的解析,那数据源这一部分呢,大家会看到啊,我们前面不是有一个data loader要把它直接先加载到数据库里面去吗?那本身的数据源就是三个CCSP文件一样,就放在这里了,给到大家,大家看到从命名上就可以看得出来,这三个数据分别是什么数据啊。对,Movies,这是不是就是电影的基本信息啊,然后有一个ratings ratings是什么?对,就是用户的评分数据,对不对,评分RA,然后还有一个types types是什么?对,是标签信息,这个types是用户给啊电影打上的标签,这就是一个用户生成的内容啊,对不对啊,这是这一部分内容,好,我们一个一个来看一下电影的信息长什么样呢?啊,大家会看到啊,电影信息主要就有这么几个字段,有十个字段对不对啊,大家看到第一个是不是有一个电影ID啊,然后就是名称,然后有描述,大家看描述有些没有对不对啊,这个我们处理的时候大家要稍微注意一下,然后时间长度对不对,多长发行时间,拍摄时间,然后语言对不对,另外还有这个类别,哦哦,这里写错了啊,类别不应该是director director是不是后面这个导演啊,对吧?类别应该是S那个那个这个词啊,然后大家看这里还有演员对不对,这里边有很多信息,但是大家可以想到最后跟我们是否给他做推荐相关的信息可能是哪些啊。
01:43
我我们会根据这个ID去给他做推荐吗?啊,你是ID大还是小,根据这个去推荐吗?这个不会对不对,那电影时间长度会去做推荐吗。就拍摄时间啊,对,有可能对吧,大家可能会想到有可能有些用户诶,他就喜欢不不喜欢太久的电影,对不对,有些用户他就喜欢两个小时三个小时的电影啊,这个可能有可能,但是大家会想到他的关联度可能就不大对吧?哎,所以大家会发现我们最后给大家实现呢,其实就找了一个跟最后的推荐结果最相关的一个特征啊,做了一个特征选取哪个特征呢?对,是不是类别应该跟最后的这个电影的呃,推荐的内容最相关啊,所以我们就以这个作为例子啊,就只选了一个类别,大家如果想扩展别的当然也是可以的,因为大家知道电影描述是不是里边应该也有很多关键信息啊,但是电影描述大家看到是不是这个有些就没有啊啊,所以这个不见得好使,所以电影类别是所有的电影都有的,那我们就以这个作为例子了,好。
02:55
呃,那接下来大家再看一个评分信息,评分信息就比较简单了,这是不是一个用户一个给一个电影做了一个评分对不对,然后还有一个评分的时间戳对吧?啊,其实就是这么简单,四四个维维度的一个数据啊,四元的一个数据,那大家可以看到我们最后这个数据是很详尽的,呃,大家可以看到啊,所以我们大量的工作都是围绕这个评分数据,行为数据来做的,对不对?营运模型是不是就基于它来做预测评分啊,好,然后我们的那个最后做实时推荐的时候,电影的相似度是不是也是基于这个来做做的啊,啊基于这个在离线的时候就把它做出来啊,这是这个评分数据,然后另外还有一个电影标签信息,这个跟评分数据非常接近,它是不是也是一个用户给一个电影,只不过就是不是评分了,是不是打了一个标签啊,然后后边还有一个打标签的时间,时间戳啊,就是这样的一些数据。所以。
03:55
对,我们接下来要做的就是从这些数据里边要去做推荐,那我们看到最详实的数据是不是电影信息和评分数据啊,啊,这一部分数据比较重要,所以我们主要就基于这两部分数据,那电影信息里边我们看到最关键的可能是类别信息,那我们到时候基于内容推荐的时候就从这个类别信息去找好呃,接下来我们再给大家看一下主要的数据模型吧,大家看这个其实已经把这个表的结构都给大家写出来了啊,大家会看到左边的这三个表,这是什么呢?是不是就是我们基本的数据来源啊,对吧?我们前面已经讲了,三个文件代表我们的这个原始数据,是不是就是一个movies,一个ratings,一个types,对应是不是就是三个表,我们把刚才的那些字段,是不是用表的形式都把它保存起来就可以了,然后另外我们还涉及到什么样的表呢?大家会想到业务。
04:55
是不是还应该有个用户表啊,啊,但是这个我们不用去太关心,我们是不是只要有UID就可以了,做推荐,你我们如果没有涉及到,大家会看到这个业务系统里边能够收集到的用户信息是哪些,主要是不是只有用户名称,用户密码和这个就是username password,还有一个创建时间啊,是不是主要收集到就是这些,那如果我们想要基于这个去做用户画像,这个基本上是不可能的,对吧?啊,当然了,就是我们后面给大家讲做冷启动的时候,业务系统里边可能还有一个,这个一开始你去点选一个兴趣标签对不对啊,那个可以去做一个冷启动,但是大家会想到那个标签是不是就是直接跟对应的电影类别匹配起来,推出来就可以了呀,这跟我们是不是跟我们的这个推荐都没什么关系了,业务系统直接就搞定了,对不对,对吧,只要标签匹配推出来就可以了,所以这一部分我们就弱化了,然后。
05:55
我们关键要实现的推荐哪些哪些需要写哪些表呢?统计推荐是不是每一个统计表都应该对应的有一个这个内容啊,所以大家看到最近电影评分个数统计,平均评分统计,呃,这个电影评分个数统计,还有top ten统计,这是不是都是统计推荐服务啊?
06:16
对吧,这四个表都是统计相关的,然后下边大家会发现是不是还有一个离线用户统计的最后一个结果啊,这个列表要有一个对不对,另外还有一个实时推荐的结果,这两个是我们的最后统计的推荐列表,另外还有一个表需要存进去什么呢?诶,就是我们在做那个as那一部分,做完计算之后,他会推荐出按照预测评分推荐出一个剧,一个电影推荐的电影矩阵,另外是不是还有一个副产品可以得到电影的相似度啊,哎,这一部分我们也直接写进去,所以大家看最后我们在mango里边主要就是这些内容,好,那接下来就是挨个去介绍我们的拈了,对不对?呃,那这一部分可能在这里就是简单的给大家先做一个做一个介绍,那后续在我们代码实现里边再给大家。
07:16
呃,详细的做一个讲解,那首先介绍的是统计推荐模块,大家会想到统计推荐我们前面已经讲了,是不是分成了四部分啊啊,这四部分就简单跟大家说一下吧,大家看这个统计推荐就是我们这一部分对不对啊,这个就是很小一部分内容,那么主要的想法是什么样的呢?我们肯定就是从业务数据库mango里边把原始数据是不是先读出来啊啊,读的过程当中,大家会想到我们是不是用session的那个read方法把它读出来就可以了呀。那么当然了,这个里边我们是不是要有一个mango和Spark的一个连接器,得有这个工具我们才能把它连接出来,用Spark session.read对不对啊,所以这个就是我们到时候用到,大家看看代码怎么实现就可以,那读出来之后是不是离线统统计服务就可以去做对应的统计计算啊,写上CQ把它统计出来就可以了,对不对?呃,这里边我们主要就是这四项,然后得到的内容是不是最后再写回去啊,点right方法写回到mango里面去啊,就是这么简单,然后我们每一项具体来看一下,第一个是历史热门电影统计,大家会想到我们这个CQ怎么写呢?怎么统计历史热门呢?
08:31
我们有一个思路,什么样的电影叫热门电影呢?我们的数据是不是只有评分数据啊,所以我们就选评分最多的,诶评分数量越多是不是代表它越热门,哎,所以大家看我们其实就是从ratings这个表里边选什么东西呢?是不是就是选大家看mid和对count,为什么是count mid啊,为什么没有评分啊,为什么没有选那个score呢?对我们是不是并不考虑它的评分大小,我是不是只考虑它出现几次啊,所以我是不是根据mid做一个group by,然后统计一下它的数量就可以了,这是不是就是对应的这个电影它有多少个评分啊,是不是就代表了它的热门度评分数对不对?哎,所以大家看到其实就是很简单的这样的一个一个CQ,然后最后得到的数据结构是不是就一个mid?
09:32
个count啊啊,这是很简单的一个热门统计,接下来大家会想到还有一个近期热门统计,哎为什么要统计这个呢?因为热门统,我们刚才的这个热门统计应该叫历史热门统计,对吧?那大家会想到历史热门统计,像这个电影啊,它往往历史热门统计,就是说已经对经过时间考验沉淀下来的这些经典电影往往是历史热门对不对?但是经典电影未必是大家有些人喜欢看的,可能他他就找的是最近的电影看,对不对,他想看的就是最近更热门的,所以并不是想要看历史经典,所以我们还要有一个近期热门统计,那定近期热门怎么统计呢?想法还是是不是统计近期的评分数量啊,哎,近期评分数量多的他就更热门,那这个近期怎么样去统计呢?
10:28
那大家会想到我们当时那个评分数据里边最后一项是不是还有一个对时间戳啊,那通过这个时间戳我们是不是可以把它转换成一个,哎,比方说年月日这样的一个数据啊,我们现在的目标是就统计每个月的评分数量,诶,那我们是不是可以把它转换成一个年月的一个格式啊,把它提取出来对不对,转换成年月的格式,所以我们这里要定义一个udf了,把它转换成年月YYYYMMMMM对吧?然后大家会想到我是不是可以根据这个年月的大小怎么样。
11:12
是不是做一个group by啊,为什么根据这个做group by呢?是不是年月做group by之后,是不是统计出来就是固定的一个月份里边所有的评分啊,哎,所以大家可以注意,我们这里边就是做了这样的一个group by啊,当然了,我们group by是不是还得对mid做一个group by,所以我们group by是两个字段。呃,就是年月和mid统计出来之后,是不是就是每一个月里边每一个电影的哎,所有的评分个数对不对啊,所以大家看到最后拿到的还是一个count对吧?当然后面我们还可以让它做一个呃项序排序对不对?排列之后是不是可以取前几个拿到的就是热门啊,最热门的对不对啊,这就是近期热门统计,好接下来大家再看哦,还有一个平均评分统计,这个就非常简单了,对不对?这个我们是不是就要拿这个score了,那score平均评分,那是不是得对所有评分的这个mid做一个group by啊,然后是不是算一个平均数就可以了,这个就非常简单,呃,最后一个稍微复杂一点,这个要统计各类别的top ten啊,但是大家其实想到这个也简单。
12:38
他怎么统计呢?那是不是我们就是看它首先是不是我们要看有多少个类别对吧,然后要看每个电影是不是属于哪个类别啊,哎,把它属于哪个类别,这个要先拿到,然后我们是不是,哎就是统计一下它的这个评分的平均数到底是多少对不对,统计出来的那个平均数,其实我们前面这个平均平分是不是已经已经得到了呀,哎,这个其实我们都可以直接用之前的结论了,然后我们做一个排序就可以,那这个过程当中大家会想到我是不是要对所有的电影类别和所有的电影。
13:20
去做一个匹配判断啊,对吧,那这个过程我们可以用什么方式去处理呢?啊,写CQL的话呢,大家会想到我可以定义udf函数,做那个字符串切分,然后是不是可以用一个爆炸,爆炸函数去处理啊呃,这是一个一个基本想法,呃这里我们不详细讲了,因为我们后面的代码给大家实现没用这种方式,我们用另外的就是在这个Spark里边,我们去用一些Spark c和算子去给大家做一些实现,其实也是思想是一样的啊,我们用不同的方式给大家实践,让大家复习一下不同的内容。
我来说两句