00:00
好,上节课呢,我们把这个用户行为的启动日志表做完了,那接下来我们来看一下DWD层用户行为事件表数据的一个解析。那这个呢,是绝对的,这个比较难哈,可以加加五颗星也不为过啊,比如说每个班到这儿的话,至少有一半同学可能要要够呛啊,要要凉凉,嗯,但是呢,你慢慢的去消化,可能这个过一段时间呢,相对来说啊,能够体会的更深刻一点啊,别着急,那来看一下哈,这个里面首先呢是。事件日志表对吧?那事件日志表ods log这张表呢?我们都知道,那这张表里面长啥样哈,再来回顾一下这张表里的数据,Red from OS even love。我取出一个啊,它就长这样,那这个呢,你看起来这个不舒服是吧,不舒服的话我们找一个。
01:08
在线格式化工具哈,随便找一个网上一大堆啊一大堆。在线格式化工具来往。这一放。这里没有啊,格式化一下。行,那这呢,就是格式化之后的这个数据啊,就是这样。多了吧。格行,那我们把它复制出来啊,复制出来,复制出来放到哪里呢?放到。这个里面。你看这个呢,是我们ods even的log里面长的这个存储的数据,存储数据呢,一个是服务器时间窗,下面这块呢,跟的是CMCM呢这叫公共字段啊,公制段下面的ape是啊,之后呢是epet里面封装了很多个事件,比如说这里面封装了display事件,封装了loading事件,封装了ad事件。
02:02
嗯,这个是什么呢?啊,Notification通知还有FA啊,也个喜好,那封装了这么多事件,我需要把它进行一个解析。那它不是一个标准的接身啊,不是标准的那种K的接身,那这个怎么解析呢?你说你用get接身,Get这个解析起来会比较麻烦,尤其这里面还有这个相当于一个数组。啊,叔叔。那这个怎么办呢?怎么去呢。啊,就说你看起来这是一个even log日志,这个日志里面呢,它包含了这么多信息。这么多张表,我们希望呢,把一每一张表的信息都给它拆取出来,那拆取出来会组成什么样的啊?就是最终我们希望的样子是这样的,前面是公共车站,我拿出来吧,我希望的是拆取出来的表长这样。对吧,上面是公司的,然后呢,如果你是这个第play这张表好。
03:03
那你的表应该长这样,我希望把你猜出来成这样。那其他表也一样,那其他表的话,如果你是一个漏定表的话,那上面仍然是公的对吧?啊还是公资的,然后下面呢,拼着它。然后再来一张上面公共质的,下面平它,然后这样去组合成11张表啊,是这样的一个需求。对吧,那怎么去做呢。比如说如何把我们想要的公共字段和它进行一个组合?啊,进行一个组合。那如果光取这个这个事件的话,很容易,刚才我们用那个get金融是完全能取出来的,那只不过呢,取这个的时候呢,稍微会麻烦一些。嗯。看你们自己想能不能想明白啊,如果是自己要都能想明白的话,那你们这个开发这块就不出现什么问题。
04:01
可能好多同学上来一下子就是懵的啊,懵的不知道从何下手,对吧?啊,这种状态呢,也属于正常,因为毕竟呢是第一次接触,来看一下啊,往下走。看这张图。这里面的很怕你们不懂啊,画了好多张图啊,每张图都画了,至少得一个小时。啊,来看一下这个日志格式呢,长成这样啊,稍微回顾一下启动日志啊启动格式,然后呢,公共字段,公共字段后面呢,这块呢是事件,事件里面包括比如说我这里举的啊一个例子,这里面包括这个display,包括ad,包括没问题吧,啊这是其中的一种日志。那对它怎么解析呢?哎,我们希望达到的效果是把这一条日志拆取出来,变成三条日志。好了啊,是把它变成三条日志,那分别对应的,哎,你这呢是取的是short time,你这取的是common,然后把display拿过来。
05:01
对吧,然后你这个呢,是这个ad拿过来,他common对在这啊,然后这个star time对在这再组合起来啊,对这个小琴啊,这个非常好啊,说炸裂就是要炸裂,你看这不就相当于是一进吗?你一行进来几行出列,是不是三行出去?进来一行,出去三行,那很显然这是这种炸裂这种方式啊,之后呢,这里面这是艾啊艾这个。走这啊,然后靠门到这儿。插到这啊,就是采用这种炸裂的方式,那怎么办呢?哎,自定义udf函数实现呢,多行啊,这个输入呢是一个数组啊,这个输出呢是多行,其实就是一个一进多出的一个概念哈,后面会给大家详细说这里面的业务逻辑。那我希望呢,这个udf函数把它传进来,传进来之后把它解析成一行。两行。三号。哎,一步一步去炸裂哈,一步去炸裂啊,然后之后最后呢,再把它们一个一个的啊取出来,比如说一步到位啊,相对来说会比较难一些,一下就炸成这样。
06:10
比较难,那你需要什么呢?哎,我只处理你这一块。你这是一个数组啊,我就跟着你这个数组传进来这个数组,然后之后我取出来你数组里面每一个值。而且取出来的时候呢,我会标记,哎,第一个值里面你的事件是什么,是什么事件,因为方便我们后续呢,往你们对应的表里面去插呀。因为你要不加上这个事件标记的话,那我加列出来这是啥呀,谁知道你这个display是哪张表里的,对吧?它的字段类型是什么呢?哎,所以说要有加上一个标记位,标记是哪张表的数据,那你日后再往这里面插的时候,那个过滤条件就是,哎,Where,这个事件名称等于display。那我乖乖的把这些数据查过来,那比如说下一条呢,这一条呢,哎,事件名称where事件条件啊,事件名称等于ad。
07:00
那我把它查回来,然后再这另一个外世界名称,等于error,把它查回来。哎,是这样去去准备哈,行稍微有点印象,那这里面还会用到一个自定义udf,自定义udf它的特点是什么呢?它是可以解析你这个comment的。其实他完全模拟的就是用那个get。啊,可以,你可以用系统的这个get进入,也可以用自定义的。区别在于哪呢?自定义的话会更灵活一些,方便我们去定位bug,比如说这一条解析没成功。那c udf完全可以把这条日志记录下来,对吧?哎,方便问题一个定位,那你get介绍object。他一旦没解析冲突,那就是挂了,直接就解析失败了。哎,是相对来说制定udf啊会更灵活一些,同时呢,也是为了给大家去扩展一下这个如何制定udf,如何制定义UDTF啊在日后的这个开发和面试过程当中啊,是属于一个加分项。啊,是这样一个考虑哈,行,所以说本次课程当中呢,我们用到自定义udf去解析这里面的公共制造。
08:05
同时把这里面哎传进去一个这个ET,取出这里面对应的数组。啊,数组,然后对这个数组再进行用这个UDFUDTF进行一个炸裂。啊炸列出多行哈行,这是从整体上啊这样的一个描述。那这个呢,我们再逐渐深入一点哈,再逐渐深入一点。再看一个详细的一个描述。逐级深入啊来看这个呢,还是这个对应的ODI乘四件表啊,四件表分这么几部分,服务器,时间,公共字段。啊,这里面ET对应着这里面多个事件,这里面只是放不下了哈,放了一个事件啊,仅此而已,那再往后那怎么对它解析呢?我希望的是把这里面这块公共字段摘取出来,形成这样,比如说形成对应的KV,形成KV。
09:06
那怎么取呢?用这个udf函数,Udf的函数呢,就是一进一出,比如说传进来一行,出来的还是一行。这个单位是一行啊,这个UDF,咱说的一进一出。OK,那传进来的,其实我们把它把谁传进来呢?我们传进来的是整个的一个整体。那这一个整体呢,我会把它截取掉,这服务器之间对吧,截取掉之后这剩下的这是一个接的。那这个接身就简单了,接身里面你传进去这个CM,相当于是传进去一个K。传进于K,你取出来的就应该对应的是这个对应的这个阶身,那你就能得出对应的这个值,因为得出这个,因为这是一个阶身的时候往这变用到什么呢?用到get杰森object就行了,对吧?你拿到了一个金串的剩下事不简单吗?哎,就说通过这个udf传进这个K,取出对V。
10:01
然后再经过get结成get,取出里面一个一个的值,这是这块我可以解析出来,那么下一步呢,我们还希望解析出来这个事件啊en把它取出来,比如说标记你这一条这个数组里面的其中这一条是哪一个事件。哎,上上张图,我说过这个事件呢,会方便我们后续把下面这个解析完的数据往哪张表里面去写,你要没有这个标记的话,那你往哪里表里插呀,因为我这边对应着十张表呢。对吧,你随便解出来一个字段往这一放,你往哪里匹配啊?哎,那你要是有了这个en的话,那后面过滤条件的时候就y en等于loading,往loading里面插,Y这个ET等于ad,那往ad广告里面插。哎,是这样一个情况啊,也就说标记一个en,那这个en怎么取出来呢。哎,En怎么取出来呢?哎,这个呢,就会用到后面的udtf啊UT来行,那这个第一个知段呢,是这个en标记是哪个事件,那剩下的这块这个作为一个整体,其实是这个数组哈,取出来的是这个数组。
11:04
这个数组我可以把它取出来,怎么取呢?通过你这个UD udf传进去en就能取出对应的数组值。可这对应的VV不就数组吗?那把你V取出来,V取出来之后再进行什么呢?再进行UDTF用它进行一个炸裂,因为这个数组里面你这是一行内容,我希望的是把数组里面每一个内容都炸裂出来,对应的一个一个的事件。这个事件的特点呢,是上面放着世界名称,下面是整个世界内容,上面世界名称整个内容世界名称整个内容世界名称内容啊,是这样的一个存在啊,那是后续的话,我们就可以通过你这个事件名称进行后续的一个过滤,然后最终把数据导入到我们想要的一个表里面去,嗯,后面这个呢,是服务器事件,然后呢,这里面是这个建表语句哈,我们中间建了一张中间表。
12:01
这个中间表呢,只是前期的一个处理工作,也就是说先把它处理成上面是工字段,这一块呢是事件字段,然后呢,这里面存储的是这个对应的每一个事件的一个阶层,并没有进行解析的。所以说它是一个中间表的一个一个状态啊叫base啊love哈,叫基础表,呃之后呢,是创建一张外。那这张外部表的字段上面是公共字段,这个呢是表的名称,之后呢是even的阶,具体的接数据后面是服务器时间啊这么三个字段,也就说它没有一步到位,记住哈,没有一步到位,我还需要对后续这块的数据再进行一个解析。再解析它就容易了,有这个表明这判断是往哪个表里面插,你这是even的Jason,它就是一个接身串,解析JA身串用什么get JA object。啊,用它就OK了哈,Get get。行。这个公式的啊,这个过来啊,这块过来一个一个对应上,OK,最后呢是按表啊,创建这个日期的一个分区表。
13:04
存储格式呢,仍然采用这个爬的列式存储。这样呢,这个就啊分析完毕了哈,也就说整个事件表的一个解析,既用到了udf应用到了UDTF,还用到了我们后续的这个get森object啊,这几个的一个组合啊,相对来说应该是市面上呃解析JA身最复杂的一个了啊,这种方式呢,也叫这个手动解析这个JA。啊,如果常规的这种就是一个接串,那直接用get接啊,接成bla直接就解析了啊比较简单。
我来说两句