00:00
前面的这个加载,加载写到这个mango里边已经全部写完了,对吧?接下来我们是不是就要保存到ES里边去了,大家先想一下,我们存到ES里边主要是为了方便做查询对吧?做模糊查询,大家会想到我们这里边要放的主要是什么信息呢?ES里边像我们这里的这个评分信息啊什么的,需要放到里面去吗?我们好像一般不会去查它的评分信息,对吧?那大家就会想到我是不是主要应该放的是电影本身的那些信息,呃,电影本身的信息里边,大家就会发现我们movie df这这里边的东西肯定是要往ES放的,对吧?而且这个数据是比较整齐的,就是一条数据,就是就是一个一部电影的对不对?那另外还有一个tab taag,这个是不是也相当于是movie的一个信息啊,用户给他打上了标签对不对,所以这。
01:00
里边我们多做一点操作,就是对他做一个处理,我们是不是应该把一个电影用户给他打上了标签,也合并到他的所有的信息里边去。所以我们准备给这个movie df里边加上一列,把这个它对应的T全写进去,呃,大家想一下我们现在啊数据预处理啊,我这里边给大家说一下我们要做的是什么呢?就是把呃,Movie对应的tag信息添加进去,那大家会想到在这个过程当中,我们应该去怎么做呢?呃,当然这个添加进去之后,但大家想到这个我们会加一列对吧?加一列,那那这一列我们应该给他一个什么样的形式呢?大家会想到这里边的tag是不是有很多个tag啊,那如果加一列,我们是不是它之间还应该有一个连字符把它连接起来啊,哎,所以为了跟之前,因为本身movie里边是不是也有一个类别信息。
02:12
大家会记得他的那个类别信息是什么样子来着。Movie,哎呦,这个看着有点不太舒服啊,我们就看上面的这个,我们之前是有过这个对样梨类的,大家看到,呃,这是演员表啊,它的类型是不是就都是用这个竖线去分割的呀,一串类型对不对?然后这个演员大家看到也是用竖线分割的一串类型,呃,一串字符对不对?所以现在我们也准备每一个tab t tag拿出来之后就应该是一个string,对吧?所以我们最后希望是也用竖线把它分割起来,是不是最后添加到新的这一列里面就可以了啊,所以大家会看到是这样的一个形式啊好,我们把它先写在这里,呃,然后在进行这个操作的时候,大家可能会想到我们要用到这个,呃,应该要用到Spark CQ里边的一些函数对吧,一些方式,所以我们先引入。
03:16
五呃,阿帕奇点Spark cq.functions我们先把这个包引入no啊,大家看到这里边有这个很烦啊,大家可以看到里边有这个collect set,有可能我们就要用到对吧?呃,所以接下来我们要做什么事情呢?接下来我们是不是希望有这么一个新的,我们就叫new tag吧,一个新的tag出现对不对?这个tag里边是不是包含了我们原先这个tag df里边,呃,大家会想到里边拿出来的所有的tag,我们要根据对应的那个midd对应的电影ID选出它对应的所有tag,然后再把它拼在一起,对不对?然后添加到我们的这个movie df里边去啊,所以这个过程大家会想到添加到movie df,这应该是一个什么操作?哦,大家会想到,那其实我们把后面的那个按mid选出来的话,后面是不是做一个状语就可以了?呃,这这个很容易想到,对吧?呃,那前边的这一部分我们是不是就要有一堆算子,可能需要有一堆算子去把它里边是不是要按照mid得做一个聚合啊,然后再拿着竖线给它分割。
04:43
隔开对不对,就是每一个电影对应的很多标签,我要把它选取出来,聚合起来,然后用竖线分割连接在一起,所以接下来我们要做的操作是这个new tag从哪里去拿呢?是不是从tag df里边去去找啊,那么tag df里边它所有的这个值,我们是不是可以用这一个group by去做一个操作,那group by诶大家看到啊,这里边的参数应该是什么形式呢?我们是不是可以直接传入一个一个列这样的一个对象啊,那大家看到大家大家应该之前写过这个就是在SKY里边它有一种简写形式列可以怎么表达,是不是可以用一个Dollar符,然后后边跟上这个列名啊,我们现在诶大大家之前没讲过是吗?那大家可以点点进去看一下源码对吧?这个大家看这个group by get set的group by方法。这里边传进来的是一。
05:43
The column对不对?那我们看一眼上面,诶,这里上面好像有有这个啊,大家看啊,这是group by是不是就是这样Dollar的一个一个写法,一个表达式啊,如果说我们对这个还不是特别的熟悉的话,我们还可以继续点进去看这个,看这个column它的这个数据类型对不对?那我们看一下,看一下它这是一个什么东西呢?呃,这个column它就是一个,呃,我们看啊,就是计算的一个基础的数据类型在这个data frame里边对不对?那大家看一眼下面这里是不是就定义出来一个Dollar加上一个column name,这就是skyla里边的一个shorthand for a named column。
06:29
所以就是一个简写形式对不对啊,所以大家如果要是有一些这个发现这些代码没见过,不知道怎么做的话,我们就点进去看看它的源码,因为大家scla的语法都很熟悉,对不对?我们进去看一下就可以知道了。好,那这里我们要根据哪一个ID来做group by呢?对,应该是mid对吧?啊,当然这里边我给大家还是把这个写出来,就是我们这里边要的是什么呢?最后应该要的是一个m mid后边是不是应该是他的那个taags啊,所有的taags对不对,那这个taags应该是一个什么样的这个数据结构呢?是不是就是我们这里的这个数据结构啊,对吧,用竖线连接的这样的一个形式,那现在我们先做了一个group by,那大家会想到接下来是不是就要做聚合啊啊,那我们用这个egg是不是可以做一个处理啊啊,那egg里边。
07:29
我们是不是要定义出来聚要聚合的那个字段,对吧?那里边怎么样去做操作呢?啊,大家会想到我如果想把这里边的这个就是tag提取出来,拼成这么一串的话,我是不是可以用一个连接字符串的一个一个方法,大家还记得吗?有一个叫做有一个叫什么的方法,是不是叫contact的一个方法对吧?我们这里是不是可以用contact with啊,因为我们是不是想要指定我那个字符的连接符,我们指定的是一个什么连接符竖线对吧?哎,这是我们contact with,那么当然contact with后边我们还应该指定对到底是什么东西对吧?把什么东西用这个连接符来连接起来,那我们要要把什么东西连接起来呢?是不是要把所有的呃这里边。
08:29
这个group by之后所有的标签要提取出来啊,那大家会想到我们还应该把这个标签是不是要要展开,然后就是多,本来这个group by之后是不是应该是一个多行数据,我们现在要把它是不是合并成一行啊啊,然后把它展开,所以在这里边大家会想到是不是就用到了前面我们看到的collect set这个。这个算子这个方法啊,然后里边我们是根据哪一列把它做这个collect set呢来看里边也是column name对吧?Dollar哪一列呢,在本身我们的这一个tag df里边,大家忘记的话,回头看一看我们的样例类。
09:17
我们要取的是不是这个T啊,我们是不是要把这里边的每一个tag做了group by之后,把它展成一个一个列表,对不对,所以在这里。我们click set里边的内容是tag,好,那么大家看到这里的话,我们是已经把它连接成一个字段了,对吧?连接成一个字符串了,然后我们是不是要给它定义出来新的这个name是什么啊?我们比方说定义一个新的name叫text,这是不是按照我们这里定义好的这个名称来的,所以我通过这样的一个操作,是不是就是把前边group拿到的东西聚合成了一个新的叫做taps的一个呃,一个列,对不对啊,所以这就是我们啊做了这样的一个聚合操作,大家看起来好像看着有点长,对吧?大家把这个括号搞清楚,哪个括号是在哪里,我们就是前面做了一个contact with。
10:21
把它先拼起来,然后as taps,那那么这就是作为我们新的一列叫做taps的一列产生了,对不对?那最后大家想到我这里边呃,这个tap df里边还有别的列对不对?我最后是不是只需要什么呀?大家想到我是不是只需要mid和tas,所以我最后再来一个呃,S selectt是不是就可以了?那么当然了,这个slet大家看到我也可以给这个直接给string对不对啊,给string的话,那我这里就mid后边给一个text,这样把它再选取出来,是不是就实现了我们的目标啊?呃,这里边要拿的其实就是我们呃最后得到的m mid tax这样形式的两列数据。
11:13
这就是我们的new ta对吧?好,那接下来这个new tag我们想到它是不是要跟之前的这个movie数据要合在一起啊,所以我们对new tag做什么操作啊,我们是不是应该让tag和movie。要做一个drawing对不对?做drawing数据合并在一起,那这个draw大家想一下,我们的draw有很多种形式啊,我们应该怎么样去做draw呢?Draw有有inner draw内连接对吧?有这个,呃,左外连接,右外连接,呃,还有全外连接,大家想一下我们现在要用一个什么样的连接做这个draw呢?呃,左外连接谁谁是左边哦movie,因为大家想到movie里边是不是有可能有一些movie,它就没有对应的这个用户标签打出来啊,因为当时我们看那个tag里边数据很少对吧,只有几百条数据,那所以是不是有一些movie对应就没有tag,如果我们要把它做inner drawing的话,是不是有些movie数据就丢掉了呀?我们并不想把movie数据丢掉,对吧?所以我们标准是不是以本身的movie数据做基础?
12:37
他应该原封不动的保留,对吧?然后如果说有tag的话,我们把tag加上对吧?诶,应该是这样一个做法,所以我们的想法就是做一个左外连接,那我们这里就叫movie with tags吧,啊当然这个连接之后我们还是转成了DF,对吧?那大家会想到我这里是不是以movie df以它作为基准去join,那大家会想到本身的这个data frame的join方法,它就是data set里边的这个draw join方法,它是默认是什么连接呢?大家如果不记得的话,我们还是点进去看一眼对吧?诶,这个我们先把它没有引入是吧?哦,那。
13:32
应该是,我们还得先把后面的东西传传进去,它才能引入,对吧?我们是不是要跟这个new tag做一个做一个drawing啊,那大家会想到我们现在是不是后边还应该指定它照应的那个呃,连接的字段对吧?它的外键对不对,我们先点进去看一眼啊,本身它的参数是不是,呃,大家看这个drawing啊,是不是可以直接就传一个data set,它的右边的这个这个data set对不对?那另外我们要指定的话,是不是可以指定一个呃,Using这个column这样的一个一个参数对不对,如果要是做这个操作的话,大家看。
14:13
它应该是属于什么样的一个drawing啊,是不是inner drawing啊,这属于是内连接对不对?如果我们什么东西都不传的话,默认应该是内连接对吧?呃,然后大家会看到下边我们还可以多传一些参数,呃,这里面我们得看三个参数的,大家看后边是不是有drawing type啊,如果下面我们还要传drawing type的时候,大家注意到前边是不是就只能是给一个一个sequence啊?是不是必须得是这样的一个形式,那就不能,呃,像前面这个直接给一个string了,对吧?呃,这里大家稍微注意一下,所以这个语法我们要写对啊,因为大家看后边是不是没有三个参数的这个招用方法了啊,这里还有。呃,当当然了,这里是可以有一个这个,呃,Join expressions对不对?这里可以给一个表达式,那如果我们不想写这个表达式的话,那就只写一个列名的话,是不是把得把它包装成一个sequence啊,所以大家会看到在这个里边上面它其实这个注释很详尽了啊,大家看一下,呃,我们这个专type是什么呢?Type of drawing to perform对吧?我们的连接的方式default是不是inner啊啊,所以大家会看到啊,其实在这个我们源码的这个注释里边说的都已经非常清楚了,然后如果我们要自己指定的话,可以指定成哪些呢?是不是inner cross alter for,呃,还有这个left right对不对?呃,Left alter right alter,大家可以看到就是有各种各样的这个type可以指定,所以我们现在要做什么呢?是不是应该做一个左外连接啊,所以呃。
15:58
这里啊,左外连接,所以我们根据这个要求,是不是先得把我们要连接的这一个外键key是不是转成一个sequence对吧?那么这里边我们传传进来的是不是应该是mid,哎,这就是我们这个做法对吧?后边给什么呢?是不是给一个字段left就可以了,表示要做一个左外连接,对吧?啊,大家如果已经忘记这个内连接,左外连接,右外连接,他们这个到底是一个完了之后是一个什么样的形式的话,这个得复习复习,应该大家讲数据库的时候肯定讲过,讲CQ肯定讲过,对吧?好,那么我们把这个连接完成之后,现在是不是就已经得到了,最后要写入到数据库里边的数据啊,这就是我们真正要写的数据,对吧?好,那接下来真正要写的时候,我们比对这个之前mango的做法,我们在写之前是不是定义了一个影视的配置参数啊。
16:58
所以这里我们也定义一个ES的影视配置参数,那么implicit,呃,大家会想到我这里应该去定义一个ES con,它是不是就应该对应我们这里的ES啊,少东西了。
17:22
然后这里边需要什么东西呢?大家可以想到是不是就是前边我们定义好的跟ES相关的这四个参数啊,啊,我们其实就是把这四个塞进去就完事了,所以这里边我们从config里边拿到http host host,然后config里边拿到es.transport哎,还是直接copy吧,打起来太费劲啊。我把这个直接copy过来,Transport host,因为大家想到我们这里定义的这个样例类,其实就是按照这个顺序定义的,对不对,最后是不是还剩下两个,一个index,一个class name啊,那我们对应的都是从conig里边拿出来就可以了,对不对?那这个也es.index。
18:21
Configgu里边的es.classname啊,这样就结束了,对不对,当然我们这里看一眼,这个没有写错吧,诶不是cluster.name对吧?跟我们在外面定义的这个内容不太一样啊好,我们把这个内容哪里少东西了,这里这里少了,好大家看的很仔细啊,好,所以我们把这个影视的配置参数定义好了之后,我们是不是就可以写这个保存到ES的方法了,那么保存到ES的方法我们要传什么参数呢?配置这个我们就不用不用直接传进去了,对不对啊,到时候我们用这个,呃,影视的参数,那么我们这里边要传的是不是就只剩下了数据,Movie with texts df这么一个数据啊。
我来说两句