00:00
刚才我们给大家实现了u daf的功能,但是大家会发现我们之前呢,它是一种弱类型的操作,为什么?因为SQL语句当中如果想用这个函数的话,那我没有办法,它只有类型的概念,它只有行和列,那所以我们之前给大家演示的是一种什么呢?弱类型的这种操作,你会发现他靠顺序来做计算,所以呢,这里都是什么零啊一啊,就容易用错了,嗯,你们老师我是吧,基本上就有可能差点用错了,哎,后来呢,诶反应过来了,所以说同学们在做的时候也可能不小心就把那个数据啊,那个位置写错了,那这样的话可能不好去判断,那怎么办?诶我们说了强类型是一个好的选择,因为强类型啊,它是通过属性的方式来做操作,那就跟顺序呢,其实并没有直接的关系的,对不对,所以啊,咱们准备把咱们当前的程序咱们改善一下,正好呢,咱们这个udf函数默认情况下,它这个地方已经不再推荐使用了,对吗?那我们该怎么办呢?
01:00
我们点它一下点点完以后大家会发现它这里面告诉你了,我们一般情况下需要用这个东西了,叫做我们的aggregator啊,里面会有in buff和out的三个类型,让你指定一下,所以咱们接下来把这个功能一块来说一下,来拷贝,拷贝以后这个地方我写个一啊,咱们写个1.7 OK。好了,放过来,放过来以后,那我别的东西我暂时呢就保持不变,但是我这里需要变一变啊,嗯,把这个地方呢,我们要先去掉,为什么要先去掉呢?是这样的,呃,我们就不继承我们的这个类了啊,我们也实现同样的功能,但是我们不再继这个继承这个类了,那我们继承什么类呢?所以我们来继承我们有一个叫做什么呢?叫aggregator。嗯,Aggre咱们的ator啊来,然后呢,这个我们的aggregator啊,我们在这里呢,给它加上啊来咱们点一下,它应该有个泛型,这个泛型我们点,点完以后有个叫in,有个叫B,有个叫out对不对,所以啊,咱们这来拷贝,诶拷贝这个担心啊,大家可能导错了,所以把这个包名啊给大家加过来啊拷贝拷贝以后拿过来放到这里给个点,嗯。
02:13
你要继承它,但你要继承它的话,这里我们要说一下,咱们这写上咱们叫做什么呢?叫定义泛型,咱们叫泛刑,因为你把类型定义好了,我们才能够用强类型的方式来操作数据嘛,那这里呢,首先就有个in啊,有一个in,还有一个叫buff,还有个叫out,那这个in什么意思,这个buff什么意思,这个out有什么意思呢?其实我们在之前讲完咱们的u daf弱类型的操作,其实你多多少少应该有印象,它里面就有in,有buff和out的概念,对不对?那这个in它表述的是输入。的数据类型。你把什么样的数据给它传到咱们的聚合函数当中,大家看一下,你不就把年龄传进来吗?那么年龄咱们说了给个浪类型来。
03:04
对吧,这个浪咱们就给它不就完了吗?所以啊,咱们给一个浪类型啊,那你输出是什么呀?Out,你out就是输出啊,所以我们写上咱们叫输出的数据类型啊,那么也是一个浪对不对,它也是一个浪,那如果也是浪的情况下,那么只剩下buff了,那么所以呢,这里给他来一个啊,咱们叫做浪就可以了,那么你中间是什么呀?叫buff,这个buff啊,但没有,为什么呢?因为浪这东西咱们都有,但你buff是用来做中间计算的一个临时的数据结构,那这时候我们肯定没有现成的嘛,没有现成没关系,我写一个咱们叫case class叫样例类,我就给他个buff好不好?那么这个buff当中啊,它应该有两个属性,一个用来保存年龄,咱们就总共叫total,一个用来保存我们用户的数量叫count,所以给个VR,然后呢,我们叫total,然后给一个对吧。然后再来,嗯,再来给上一个VR,我们叫can,嗯,咱们叫count,给他一个我们的long,诶,你这么写就行了。
04:08
那为什么用VR呢?是因为我们盖LA当中样例类默认情况下它的属性是不能改的,对吧?在构造参数当中定义属性是不能改的,那么你加上VR之后它就能变了啊,所以把这个buff呢,给它放到这个位置,所以啊,咱们这个uff呢,就写上咱们叫缓冲区,缓冲区的数据类型,那么咱们这里用的就是我们的buff,诶这么写就可以了,写完以后,接下来我要重写方法,重写方法咱们ctrl I回车,回车以后大家会发现咱们现在呢,12345,诶有个六,所以啊它总共的方法其实不是八个了,变成六个了,诶好像少了一些对吧?那好我们来看看都分别是什么,首先第一个叫做G啊,把这个给它放过来。这是什么意思呢?这个给大家解释一下,一般情况下,在GALA语言当中,我们用Z打头就是用这个。
05:05
字母Z打头或者呢,它的名字带zero的一般都是叫初始,或者称之为叫零值啊,咱们叫做什么呢?叫做初始值啊,或咱们叫零值。就这意思啊,就是比方说你碰见了他啊,或者呢,是什么呢,就或者是这个东西,嗯,它都表这个意思啊,都表这个意思,所以啊,他这个就叫初始的意思,那这个叫buff嘛,意味着缓冲区的初始化,对吧?诶,所以它叫缓冲区的初始化。那怎么初始化呀?那太简单了,你这不就全是空吗?对吧,我们写个buff,然后呢,写上一个括号零,然后呢,给他一个咱们的。你这A写个零啊,这样的话就OK了,这就是一个初始化呀,诶没问题啊,然后reduce是啥意思啊,那reduce不就是聚合的意思嘛,对不对,所以我们就写上啊,咱们叫做缓冲区啊,或者这么说吧,咱们叫根据根据我们的输入的数据来更新缓冲区。
06:06
缓冲区的数据。诶,你看一下这个是不是浪,这个浪呢,就是那个输入咱们叫做一啊,这个咱们就叫buff,诶就叫buff就行了啊好,那这里呢,拿过来,拿过来以后呢,咱们的buff呀,咱们就点儿那点儿啥意思呢?就是要去做操作呀,所以它的那个叫total,它就等于,哎,咱们写上它等于咱们的旧的值叫旧的total,再加上in,这样的话年龄就增加了,对不对,好,但是你光年龄增加不行啊,点一下咱们叫做count,你得加一呀,对不对,所以buff,诶点我们叫count再加一,这样的话就OK了,但是呢,它要求去返回一个buff,因为它要更新缓冲区嘛,所以把buff给它还回去,嗯。好了,那咱们再回过头来,这个就简单了,这叫me,那这就是合并啊,咱们叫做合并咱们的缓缓冲啊,缓冲区,合并缓冲区的话,那这个地方呢,我们就写上了啊,咱们叫做嗯,Buff,然后这个写上咱们叫BUFF2,好,然后呢,拿过来,拿过来以后,那么我们的BUFF1咱们写上点,它的总和应该等于它自身。
07:21
对吧,我们写上叫做点我们的总和,再加上那个BUFF2。BUFF2,诶,它的那个总和对吧,然后再来那个count,嗯,那个count,然后呢,拷贝,拷贝以后放过来,然后呢,把那个BUFF1给它返回了,所以这样的话,我们的多个缓冲区啊,就合并在一起了啊好,接下来接下来什么呢?这个叫做finish,就是整个函数完成了,说白了就是计算啊,计算结果,那么这个结果太简单了,因为我们当前已经有我们的总的年龄了,还有总的数量,你相除不就OK了吗?所以来我们写,诶这个咱们也改个名吧,咱们叫bus。
08:04
好拷贝,拷贝以后拿过来点,我们叫做total,然后呢,再除以B点,我们叫count,诶你这么写就可以啊好,那现在呢,我们的一般的计算呢,都完成了,它当然还有两个,这个叫buffer encoder,这个叫output encoder,这什么意思呢?是这样呢,因为我们的分布式计算,它需要将我们的数据在网络中传输,对不对,它就涉及到一个序列化的问题,它也涉及到一个编码的问题,所以啊,咱们这个引扣的就是一种编码,对不对,那么抵扣的就是一种解码了,那这里我们就说一下啊,咱们叫做什么呢?缓冲区,缓冲区的一个编码操作,好,那这个呢,就是output叫输出嘛,咱们叫做输出,输出的编码操作,那么缓冲区的编码操作呢,其实因为它是自定义的嘛,自定义有一个固定的写法,咱们叫encoders啊encoders,然后点它有一个咱们,诶不对,它这个没有倒过来啊。
09:03
咱们这里呢,给它点一下encoders,点一下它里面有一个叫product,诶就是它啊这定固定写法,如果这个我们的类型呢,它是我们该自带的,所以呢,它这里面还有会也会有固定的类型啊,咱们叫盖LA了,在这儿呢,所以这两个操作其实基本上你不用管它,它就是固定写法,你自定义的类,那那我们就叫product,如果是我们skyla就存在的类,就叫SKY了就可以了啊OK,那我们这里呢,就把它写完了,那写完了以后呢,怎么去用呢。因为你现在已经是有个类型了,你不是弱类型的,你是有类型的,那么有类型的情况下,你的这个地方就不能直接用了,对不对,那该怎么办?其实啊,咱们在之前的这个地方有提示,同学们看啊,我点一下点点完以后他说了他要这么去用,叫做function式,点UDAF有个传的对象进去,所以啊,它的用法呢,其实已经提示你了,在我们当前的代码当中,我需要这么来用。
10:03
拷贝,然后把它放过来。好了,这边有个叫functions啊,给它倒一下好,倒完以后啊来。就是你之前呀,你是不能够把一个我们有类型强类型的这种操作给一个我们弱类型的circle的,这你做不到,因为呢,他不关心我们的类型,而这里关心类型嘛,那么它就是强类型的,它就是弱类型的,那么这样的话是不兼容的,但是呢,它增加了一个我们的功能啊,增加了一个转换功能,将我们的强类型的这种函数,诶转换成了弱类型的操作,这个时候呢,我们就可以用在这个位置,好,我们来看看结果跟我们预想的是不是一样的啊来别写了半天结果不对,那肯定不行吧,对不对。好,同学们看结果是不是跟刚才是完全一样的呀,但是两种不同的处理方案,哎,就实现了好吧。
我来说两句