00:00
来我们现在呢,先看一下第这个4.5.4.1.5这个动作日志表啊,这块啊,动作日表啊,这个我不让大家看下面内容了,这里边有提示是吧,咱不看了啊,咱来自己思考,你说动作日表当中啊,那这个它应该来自于哪哪哪哪哪哪哪种日志啊,咱们先分析一下哪种日志肯定是页面日志啊,这个没什么可说的啊,那这张表肯定是这个日志啊,来咱们打开。来自这个,来自这个日志之后呢,咱们接下来继续往下思考,那你说我这个这个动作日表,咱们应该怎么设计。怎么设计呢?还是考虑俩问题啊,一行数据是什么,然后呢,呃,字段应该有谁对吧?那咱们来分析一下吧。先说一行数据,应该是。啊,咱们得考虑一个问题啊,因为你这个DW层是不是得是最明晰的数据啊,对不对,那对于操作来说,那最明晰的就是啥?就是依次操作是不是要做一行数据,哎,这个咱们明确啊好,那明确这个问题之后呢,咱们再来说这个表里的字段。
01:08
比字段应该是谁?Common字段是肯定得有的,对不对啊,那动作字段呢?哎,那动作字段你说这怎么处理,你说我在这一行这个咱们那个动作表当中啊,你说我这个动作相关的字段应该是写一个action。还是写这里边儿具体的字段。啊,写actions和写具体的字段有啥区别呀,如果说你写一个actions。那是不是这一个字段下边就应该是有多个动作了呀,对不对,那这是不是就违背了咱们那个明细这个原则了呀,对不对,那所以说应该放谁呀,应该放这里边具体的字段对不对啊,肯定是具体字段啊,这个得搞清楚啊,然后下边呢,这个呃,TS要不要,哎,这个是要的啊,这是要的啊,OK,那大致呢,就是这么多的字段,大致就是这么多。啊OK,那这个配置字段呢,其实啊,咱们也可以考虑把它放在咱们这张表里啊,为什么也可以考虑放在这儿了,这个配字段相当于是对这个动作的一个什么信息啊。
02:11
其实也是一个描述印记,对不对,咱们是不是得知道这个动作是在哪个页面做的呀,对不对,其实这个呢,也可以算作它的一个描述信息,或者说算作这个维度的,算的这个动作的一个什么呀,一个维度对不对啊,也是也是可以的,因为咱们建模的时候呢,咱们前面考虑DWD是打基础,那我能放的时候是不是尽可能放上啊,对不对,是这个出于这层考虑啊,所以最终咱们可以决定下来,这个动作表当中,我们所包含的字段有common,哎,有动作字段,有配置段,有这个TS。啊,这个TS呢,相当于是这个页面的跳时间啊,当然这个有没有其实无所谓了,因为咱们这动作是不是有自己的动作时间呀,啊这个搞清楚就行啊,啊大致呢是这么多。啊行,呃,大致分析完了,分析完之后呢,那咱们来继续往下思考啊,咱们这个日志啊,去解析的时候,咱们需要考虑什么问题。
03:04
啊,需要考虑什么问题。啊,考虑什么问题。啊,咱们跟前面的表先做一个类比啊,咱们先说启动日志啊,先说页面吧,咱们刚才是不是从这张表里解析了一个页面日志表啊,对不对,那页面日志表当中我一行数据指代的就是什么,是不是就是一次页面浏览记录,那在ODI层呢,我们这个日志啊,一条页面日志它指的就是什么?是不是正好就是一次页面浏览记录啊,因为咱们都知道这个页面日志是不是就是你浏览一个页面生成一条啊,所以这个正好ods层和你DWD,那这个是什么的,是不是一对一的呀,对不对,一条日志那正好解析成一次,呃,正好解析成咱们一次这个页面聊天记录,这个没问题吧,这是页面表示一对一的,但是呢,咱们先来考虑这个动作表啊。动作表啊,那动作表刚才咱们分析了动作表当中一行数据应该指代的是一个动作,或者叫一次动作,对吧?啊,就是一个action啊,就是在DW层的动作表里,然后在ODS层呢,我们这一个页面日志啊,就是一行日志,我里边可能有几个动作呀,是不是可能有多个动作,因为是actions是数组,对不对,所以说我这里边呢,可能有多个动作。
04:19
啊,那所以说我们再去解析的时候呢,就得考虑这样的问题啊,咱们需要将ODI层里边的一行数据是不是得转化成。多行数据啊,是不是有这个问题啊,那这个问题咱们这怎么去解决。啊,不是来一条我解析一条了,是来一条我得解析成多条。啊,类似这样的操作,大家之前有没有做过。有没有做过?就是一行变多行嘛。对不对,有没有做过。没做过,不可能绝对做过,咱们学have的时候有没有过类似的操作,有吧,啊对,是不就炸裂呀,是不是咱们有一个那个什么函数来着,1LO的函数啊对不对?大家还记得那个lo的函数怎么用吗?还是不是得有一个letter you那样一个语法呀,还记得啊,还有点印象啊,这个还挺不错的,其实呃,咱们刚学完Spark对不对?
05:17
SPA当中咱们应该有一个算子叫做flat map,对不对?Fla map跟这个explode是不是应该是相同的操作呀,对不对啊,是一样的啊,当然这个咱们就不用考虑那Fla map了,咱们就考虑啊,咱们自己的这个exp函数就行啊,那这个explo的函数,咱们接下来呢,就就来回忆一下啊,Explo它呃是have当中给我们提供好的一个函数,对不对?那那个函数它能接收的参数类型是什么?就是一次函数,它的参数类型是什么呀。什么什么类型?什么类型来着?数组类型啊,对不对,或者是map类型啊,Explode函数,它所能接受的参数类型只能是数组或者是map,如果你给他,你给他传的是数组,那它会把你这个数组炸成什么?
06:07
是不是占成多行对吧,然后每一行里边有几列。是不是就一列呀,因为一个数组相当于一个元素啊,一行一个元素一行是不是就是一列,但是如果你给它传的是map呢。那也是炸成多行,然后呢,一行是不是一个KV建筑,对啊对不对,然后几列啊。两列K1列,Y61列啊,这是咱们explore的函数,它所能接收的这个参数类型啊,那但是咱们这你看一看啊,我们这个参数类型是什么。咱们要炸的其实是谁呀?是不是应该炸的是这个玩意儿,对不对,那这是一个啥呀?是一个数组,是一个接子数组对不对?但是如果从have的这个数据的类型上来考虑,这就是一个啥呀。这就是一个字符串,因为咱们ods层的那个烂字段就是一个字符串类型吧,然后呢,你相当于从这个烂字段里边去获取一个这样的子子子这什么呀,相当一个子串对吧?啊对不对,你把这个是不是拿出来了呀,拿来之后呢,交给谁,交给咱们这个伊索罗函数去炸,它能炸开吗?它炸不开,因为你不是数组类型,对不对,你是什么,你是字符串类型,说实话还是。
07:19
对吧,那这个你用explore函数能炸吗?炸不了,那这个怎么办呢。他炸不了,咱们就得怎么做。对,你就得自己去写函数了啊,咱们可以自己去写一个什么函数了啊,专门用来炸这种接森数组字符串的这种啊函数啊,咱们自己写一个来帮助我们去解析,哎,这个日志。是这样的,所以在这儿呢,我们就需要用到have当中的这个自定义函数了啊,那咱们现在提到提到自定义函数了啊,那提到自定义函数之后呢,我们接下来先来分析分析咱们自定义函数的类型有哪几种。哪几种三种UD UD udtf对吧?Udf是什么。
08:01
一进一出,那UDTF呢一进。多出udf呢,多进一出对不对,那我问大家一下啊,这个所谓的一进一出,一进多出和多进一出。这个一和多的单位应该是什么?这个一指的是一什么啊,这个多指的是多什么。什么呀?行没错,是行啊,Udf呢,就是来一行,我是不是返回一行啊,那UDTF呢,来一行怎么样返回多行对不对,它说的是行啊,这个得搞清楚,然后udf呢,是不是来多行,我给你返回一行啊,这个UD相对就是啥呀,是不是就聚合函数啊对不对?萨姆求和是不是多行聚合到一行里边了,哎,这就是多行啊,这多多进一数,那这个咱们得搞清楚啊,那当然在咱们这这是应该属于哪种啊。Udtf吧,很显然来一行是不是我要返回多行啊utf,所以说咱们这呢,需要自定义一个udtf函数。
09:04
啊,这个咱们搞清楚啊,Uf啊,这是我们接下来啊需要去做的事啊好,那整个的思路呢,咱们分析的差不多了啊,我把视频先录一下。
我来说两句