00:00
好,那接下来我们分析一下动作日表的数据装载逻辑啊,那这张表的装载逻辑啊,和前边两张表相比要稍微难一点啊,为什么要难一点啊,咱们接下来做一个简单的对比啊。啊,先来简单回顾一下前面两张表的装载逻辑啊来我们看一下前面两张表呢,分别是页面日表和启动日表对吧?啊,那启动日表的数据是不是主要来自于这种结构的日志啊,我们叫页面买点日志对吧?那动作日,呃,那启动日表的数据呢?那是不是主要来自于下面这种结构的日志啊,我们叫启动日志对吧?OK啊,那咱们观察一下这两两种结构的日志啊,那这种结构的日志啊,页面买点日志,它是不是以页面为单位啊,也就是说,呃,用户只要浏览一个页面,那就会产生一个对应的页面买点日志对吧?啊,OK,那下边呢,启动日志其实是以启动为单位的,对吧?只要用户启动一次应用,那就会产生一条对应的启动日志。
01:01
啊,没错吧,啊,那所以说啊,那一条页面买点日志是不是就正好对应诶页面日志表当中的一行数据啊,那一个启动日志,那是不是就正好对应启动日表当中的一行数据啊啊那所以说我们在解析这两张表的这个数据的时候呢,比较简单啊,我们只需要通过简单的过滤啊,获取相应结构的日志,然后呢,再直接使用get object函数啊,去逐个字段进行解析就可以了。啊,没错吧,所以这个其实思路是比较简单的啊,那接下来我们再来看呃,动作日表啊,那动作日表的数据主要来自于哪种结构呢?是不是主要来自于这种结构的日志啊,对吧,也就是页面买点日志,那大家注意观察一下啊,那一条页面买点日志当中啊,是不是有多个动作呀,对吧?你注意观察它保存动作的这个结构是不是一个数组啊,对吧?那就说明呃,我一条页面买点日当中可能会包含多个动作。
02:02
而动作日表当中呢,一行数据是一个动作对吧?那所以说我们在解析动作日表的数据的时候呢,就需要用到一个一进多出的操作啊,那也就是说进来一行数据我需要返回多行啊,那进来的一行数据实际上就是一条日志对吧?那出去的多行数据应该是什么呢?每行数据是不是就是一个动作呀?没错吧,也是我们这儿需要一个一进多出的操作啊,那我们简单回顾一下啊,那have当中有没有一进多出的这种操作呢?哎,实际上是有的,对吧,我们管它叫做UDTF对吧?啊,那have当中有一个自带的UDTF函数,那就是谁呀?就是那个explode对吧。啊,OK,那explode能实现什么样的效果呀?啊,Explode是不是能够接收一个ARRA或者一个map呀,对吧?比如说我给他一个ARRA,那这就给他A瑞里边呢,有三个元素ABC啊,OK,那它是不是能够把这个数组,诶给他输出多行啊,对吧?那每行是不是就是一个数组当中的元素对吧?也就是说给他一个数组,这是一行对吧?能给我返回多行,那每行数据就是数组当中的一个元素,这就是一个一进多出的操作。
03:11
没错吧,那其实咱这在解析动作日志的时候呢,也需要一个类似这样的操作,那我们思考一下啊,Explode函数能不能帮我们去解析日志呢。啊,其实是不行的啊,那为啥不行,那刚才其实也提到了啊e explore的函数它能接收的参数类型呢,是不是A瑞或者是map呀,对吧?那我们这儿要解析的日志是什么类型,是一个字符串类型对吧?啊,那所以说explore的函数是不能帮我们去完成这个功能的啊,那怎么办呢?那我们只能自己去写一个udf数了,对吧?那OK,那简单分析一下咱们这这个udtf数要实现的功能应该是什么样的啊,我们往下啊在这我画了一个图,一起来看一下啊来这个呢,就是我们解析啊动作日志的时候需要用到的一个UDTF,咱们来看一看它能实验的效果是啥啊大来看左边。
04:04
左边这是不是就是呃,我们的一个页面日志当中所包含的一个动作数组啊,对吧?啊,这是一个动作数组,那当然它的形式,它的格式就是一个字符串,对吧?OK,那我们就需要将这样的一个字符串是不是转成多行,那每一行是一个什么,每一行是不是就是一个动作呀,对吧?那当然这个动作呢,也是一个字符串,OK,那咱们的UDTF函数就要实现这个功能啊,那我们来明确一下啊,这个UDTF函数它的输入和输出到底应该是什么?那我们先来明确它的输入啊,那它的输入呢?那其实很简单,是不是就是一个杰森数组字符串啊,对吧?那所以说输入我们只需要一个参数就可以了,什么类型的随论类型?那OK,这个比较简单,那接下来我们再看输出啊,一个udtf函数啊,它的输出大家都知道,肯定是多行啊,当然大家可能不知道的是什么呢?UDF函数是可以输出多列的。啊,比如举个例子啊,那以这个explo函数为例,就是haveve自带的那个UTF函数对吧?那如果说我们给它传进去的是一个ara,那OK,它会输出一列啊,那如果我们给他传的是一个map呢?OK,它会输出两列,一列就是当中的K,另一列呢,就是map当中的V啊,OK,那咱这儿这个输出应该是什么呢?
05:20
我们这儿呢,输出的应该是什么呀?应该是一列,然后呢是多行啊,这一列是什么类型的呢?哎,这一列其实就是一个死尊类型的就可以啊,那每行是一个什么,每行就是一个动作啊,就像它像就像右边咱这个结果一样啊,这是咱们输出来那一列啊,那这就是每一行,每一行就是一个诶杰森字符串,那当然内容呢,就是一个action啊OK,这就是咱的输出,那有了这个udtf之后呢,我们就能够将输入进来的一行日个那容我们get去依次获取每个动作当中的每个字段就可以了。
06:04
啊,那这个就是动作日表的解析思路。
我来说两句