00:00
呃,来吧,同学们,那现在呢,我们继续往下进行,那截止到现在日志表咱就算是完成了,那下边呢,我们看第二种类型,也就是我们的那个什么表了,应该是业务表当中的全量表,对不对?好,那现在我们先看全量表,那全量表在这边呢,我们应该怎么办呢?是不是也得参考它的那个数据的结构去设计啊,对吧?好,那现在呢,我们就随便挑一张表为例啊,咱们去参考一下它里边的这个相应的结构,我记得之前咱们应该是看过,对吧?来往上找一下啊,呃,应该是咱们看的谁来着,找不着了,找不着了,那咱们现在再重新看一下吧,来咱们找一张这个全量表的数据啊,应该是on date jma,找到哪DB,对吧?DB,咱们就以第一个为例吧,哎,就以它为例,哎,找到这个路径啊,可能拿过来拿了之后呢,在这我们还是得执行一个不是high do FS,然后杠cat呀,对吧,来拿到它,然后后边来一个星,后边来一个c cat对吧?好行,数据现在就已经摆在这了,那接下来咱们就分析分析我怎样见表才能正确的解析。
01:01
这个文件里边的内容,这个是不是就是常规的那个操作来对吧,对不对,这个大家就熟悉了啊,这个表我到时候我就怎么建就行,是不是有建表,然后呢,声明具体的字段,这个字段跟谁一致,跟这个文件是不是保持一致就行,当然其实最终是跟谁一致,是不是跟MYSO当中保持一致就行,对不对,因为这个文件的字段现在跟MY那边是不是一致的呀,对吧?哎,所以说你这个跟MY那保持一致就行好,那么之后呢,就是我们这个文件的存储格式,是不是就直接用那个RO for ma什么就行了,D limited的feels turn是不是用那种语法就完事了,这就是常规的一个用杠T风格的文件,对吧?那所以现在呢,我们就可以直接去看一下这个最终的键面语什么样的了,这个我们就不再去一点点写了,这个比较简单页来啊好,接着往下走,我们就找到我们业务表当中的第一个,哎,这是这就是一个全量表,来,CTRLC咱们拿出来来,现在呢,我们一起把这个接本语句给它看一眼。好,各位同学,那现在咱们一起来看一下这个界表语句啊,首先我们还是先看它的表名OS activity负这个是不是也是满足咱这个命名规范的呀,对吧,没啥问题,接下来我们还是看它得看看一下它的表结构啊,它的表结构是就是每行还有美列,还有分区规划呀,对吧?行仍然是跟谁保持一致呢?跟谁一致?行其实就是还是跟文件是不是保持一致啊对吧?那当然文件这块其实跟谁一致呢?跟MY搜狗表一致对吧?其实说实话就是这张表的表结构跟MY当中与之对应的activity in那张表是不是应该基本上是一样的呀,对吧?哎,这个咱就不多说了啊,行行一样,那列呢,肯定也是一样的,这个我就不再嗯不再不再啰嗦了啊,那下来往下走,最后明确一下它的分区规划,你说它的分区是怎么样的,是不是仍然是按天分区啊,对吧?哎,仍然是一天一个分区,那他每天的分区里将来会存什么数据呢?是不是仍然是存,就是咱们这张表每天从业务系统同布过来的那个全量数据啊,对吧?啊,就是这样的这个。
02:53
我就不再多说了,好,行列分区都完事了,最后我们来看一看下边这个东西啊,首先第一个就是ROM,这回是不是变成了limited的fields terminated by-T了呀,对吧?好,那问一下大家,就是这个杠T,你最终最终要跟谁保持一致?
03:09
肯定是跟这个文件保持一致,对吧?那这文件又是由谁决定的呢?这个由谁决定的?由同步工具data叉决定的吧,对吧?这个文件是不是由date叉给咱们写上来的对吧?那所以说在data叉当中,那里边有一个参数叫做什么呀?叫做H,叫做那个那个那个那个那个writeer对吧,对吧,Data上是不是得有reader有writeer对吧?那我们在这写出用的HDFSR里边是不是就有一个参数是那个分隔符,当时咱们指定的就是杠T,那所以在这儿呢,我们这张表也得是杠T,这个很简单,接下来下一个这个比较关键。这个参数大家还记不记得它的作用是什么?大家在学data方的时候应该学过这个参数,对吧,叫做什么no底DeFine的I是不是就是空值被定义成什么东西啊对吧?空值的存储格式咱们这用的是啥?是空字符串对吧?这是一个空字,这为什么要空字符串,这其实是是跟谁跟谁有关呢?这还是跟电子框有关,Data它是这么做的,大家都知道,买so当中我是不是可能会有空空值啊对吧?那空值我最终通过data叉写到HDFS之后,对吧?理论上啊,我应该让这个控制保存成什么?
04:17
最好是让它保存成反斜盖大N,为什么?因为就是这个文件,我们将来大概率时候会漏到一张how表里,对吧?那have表当中默认就会把空值存成什么呢?反斜杆大对不对?那所以说我们为了保证数据将来漏得到haveve表里对吧?我们haveve能正确的识别空值,我是不是就应该给它保存成反斜塔呀,对吧?但是对超它是这么做的吗?它不是他不会把这个估值保存成反利大概,而且他也没有给我们提供相应的配置参数,对吧,你可以去指定你把空值存在没有对吧,所以说它只有一个,就是具体的值,它就会存成什么呢?空值就是存成空字符串,那所以说这边没办法,只能是我们害过这边书向它妥协一下啊对吧,我们把它存成这个,诶空字符串那就完事了,哎,当然呢,你去改一下这点的源码,让它支支支持这个反射大是不是也是可以的,对吧,那那个就比较麻烦了,行了,那是这个参数,咱们就说完了,最后再来明确最后一个这个东西啊,就是location location是不是为我们指定一下这个存储路径啊,对吧,这个就不再多说了,行了,那这个表的建表语句那就完成了,那在间表语句完成之后,是不是理论上我们也得考虑一下它的数据状态啊,它的装载怎么做呀。
05:28
怎么做呀?它的重点其实很简单,是不是也是漏了一下就完事了,对吧,也是漏的啊,那所以这个漏的余我就不再重复的去写了啊,就是一会儿呢,咱们去也是最终咱们去创建一个脚本,咱们最终用脚本往里边漏了一下数据,那就完事了啊,这个理解一下就行了啊好,那完成之后视频。呃,来吧,各位同学,那咱接下来呢,来设计一下,就是我们第三种类型的表,也就是用来去存储谁啊,存储那个业务表当中的增量表的这样的表对不对?OK,那增量表呢,咱们先找一张啊,呃,找谁呢?我们对一下DB完了之后呢,随便找一个IC car0后的对吧?那咱们就找他,OK,那这张表当中,呃,这这个路径下面存储的是不是就是我们这个呃,增量表对吧?通过那个Maxwell对吧,上传过来的这个数据对吧?就长这样的啊好了,现在我们把这个路径给它拿过来,完之后呢,我们执行一个这个查看的命令,把这个删除。呃,还是还是那句话,就是咱们设计odf表是不是就得看着这个日志,这个数据的结构去设计啊,对吧,来拿开。
06:26
好了,那这个数据就摆在这儿了,那这个东西咱们怎么设计。这个文件整体的结构呢,仍然是一行是一个杰森字符串对吧?那所以说我们再去建表的时候,也应应该选用哪种方案呀,杰森表呗,对不对,杰SS1是不是就完事了对吧?好,那现在所以说我们现在就得把这个具体的呃一条接森数据给拿出来,咱得对照着字段去是去设计咱们那个表对吧,应该是这样去做啊啊所以在这呢,我们把它诶给它复制一份出来,那之后呢,我们找到一个阶S美化工具啊这边呢,我们ctrl a ctrl v拿过来好了,那这就是我们现在拿到的一个诶完整的这个Maxwell输出的日志对吧?好了,把它放在这儿,那接下来咱们要做的工作是什么?是不是就可以根据它去设计咱这个阶分表的具体的结构了,对吧?这个结构呢,当然我们重点还是关注字段就行了,呃字段呢,一个就是字段的呃个数都呃还有一个呢,就是字段的类型对不对,好,那现在咱们就来确定一下,好,那说我们这个字段具体的个数怎么确定,到底建几个字段呀,几个段呀,理论上按照我们之前的那个说。
07:30
应该怎么做来着,是不是跟他的一级字段保持一致就行了,对吧,他这有几个字段,那我表示就有几个字段对吧?哎,但是你可以想一想啊,我们这里边的字段都要留下吗?有必要都留下。其实有些我觉得是不是可以不在这个表里边体现出来啊,对吧,那比如说谁就没有没有啥用啊,比如database这有用吗?这没用对吧,他只是用来表明,就是咱们这条数据是来自于哪个数据库的,对吧?它对分析而言没什么用,对吧?所以这个咱们可以不要,同理table是不是也没啥用啊,对吧?好,那接着往下,这个type有没有用。
08:03
有没有用,咱得先回忆一下这个type指的是什么来着,Type指的是类型对吧?指的是什么类型?指的是我这个Maxwell输出的这条数据的变更类型吧,没问题吧,OK啊,就是大家都知道我们这个增量表是通过Maxwell去做同步的,那我们输出这个类型呢?其实你得分两种情况去讨论,哪两种同况呢?一种是做全量同步的时候,一种是做增量同步的时候,对吧?因为我做全量跟做增量同步这个类型是不是不一样啊,对吧?你做全量同步的时候,咱是使用谁来着,是使用boop去做的,对吧?那boop同步过来的数据,它的类型是什么类型来着?是boostrap insert吧,这个大家还有没有印象啊,对吧?其实诶,使用这个boostrap同步来的这个数据不只有bootrap,还有另外两种是什么来着?是波特吧。Start吧,还有一个是不complete吧。
09:02
还有印象吗?我看有同学已经忘记了啊好,那现在咱们打开之前的文档,这会还是有必要去回顾一下的啊,那现在我们先简单的回顾一下Maxwell输出的数据的结构,来,那现在我们打开之前的这个文档,找到这个业务数据啊,业务数据,业务数据业务数据在在这儿呢,然后呢,找到咱们之前的那个数据同步工具部署这一节啊,完了之后呢,找到Maxwell,其实在这一节当中呢,就已经给咱们呃清楚的展示出来了Maxwell输出的数据的结构了。好,那现在呢,我们先去看啥呢?先去看boop那种输出的数据的格式啊来王等,这就是使用boop,也就是全量同步对吧?输出的这个数据的格式,你注意观察一下啊,它里边类型是不是分为这样的三种,Bootrap start bootrap insert,还有最后一个就是boostrap complete,对吧,这前后这个开始和完成,这个指的是一个什么来着,是一个开始和结束的标志吧,对吧?哎,它里边会有真正的数据吗?没有,你看它date是不是都是空的呀?
10:02
对吧?OK啊,那中间的这种类型是不strap in inside的里边是不是才会有真实的表当中的数据啊,对不对?这个一定要搞清楚啊,好,那现在我多说一句啊,假如说某条数据,我的这个type就是BOO in的,那你说这个date里边对吧?那它对应的数据应该是什么呢?是MYS当中的一条变更操作,还是真正的一条数据?是一条数据吧,对吧,因为boottra我们是基于什么的来着,查询这个一再强调啊,那所以说你基于查询的这个date对吧?一条data是不是就对应表当中一行数据啊,对吧?诶,这是对应的啊,这要搞清楚好,这是BOO这种输出的格式,那接下来我们再看那种基于blog真正的去做增量同步的时候,对吧?那我这个mawell输字的格式什么样的,是不是一共分为这样的三种啊对不对,这三种我们逐个的看一下,哪三种呢?分别是insert update还有delete对不对?OK啊,注意观察这个三种格式当中呢,有一个稍微有点特殊,谁有点特殊呢?
11:00
Update update当中是不是它多一个字段要比其他的就是多了一个什么old,这个old大家还记得是啥吗?还记得是啥不?哎,这很简单,因为你要知道啊,其实大家都知道在update这种操作当中呢,我们视是一个修改操作,对吧?修改操作它得保存什么信息呢?得保存我这条数据,修改前是什么样的,修改后是什么样的,对不对?OK啊,那完之后呢,这个修改前保存在哪呢?就保存在后里边对吧,那这个date里边保存的是什么呢?就是修改后的数据啊,是这样的啊,然后你注意观察,就是date实际上是会保存什么呢?保存咱们这条这张表当中的所有字段的这个数据的,那是这样的,而all里面只保存什么来着。哎,只保存你本次修改的那个字段原来的知识,哎,这1.1定要搞清楚啊,好了,那这个就是,哎,咱们这三种数据的结构啊,OK,行了,那完成之后呢,我们再回到之前咱们这个话题上面来啊,那现在呢,我们要讨论的问题是什么呢?就是这个type啊,咱们有没有必要留下来。
12:05
对吧?表里边有没有必要加上一个type这样的字段,但是有没有必要对吧?这个type可能是不in inside的,可能是BOO什么呀,呃,不什么呀,比如说不呃呃,不in,或者是不start,或者是不complete,对不对,那还可能是inert update delete,但说这个类型咱们有没有必要放在我们这张表当中,有没有必要放取决于什么呢?就是将来你从这张表里查数据的时候,我我要不要用到这个字段,对对吧,大家说我会不会用到这个字段啊?那肯定是会用到的呀,对吧?比如说什么时候会用到呢?比如说我们现在先以就是这种bootp那种类型的数据为例啊,你想一想,就是将来咱们建好这张表,我把数据往里导,导进来之后,对吧?我们是不是会有那种puttrap start的,会有puttrap,呃,Delay那个complete的,是不是还会有中间的putp in inside呀,对吧?但是你要知道这些数据我们将来分析的时候都要用到吗?不用了,我只要什么样的,我是不是只要中间这个类型为bootrap in inside呀,对吧?那所以说将来你从这张表里往外查数据,你得干啥,得过滤一下吧,对吧,你过滤就得根据什么过滤呢?是不是就得根据type这个字段进行过滤,对吧?所以说将来会不会用到这个字啊,会呀,对吧?那这个是会的,OK啊,那所以既然会用到那是type这边咱们就得留着它,那其实不光你不trap这种类型的时候,你会用type对吧,那什么时候还要用呢?对于我们将来那种你那个那个就是做增量同步对吧,基于blog的,呃,那部分数据对吧,你拿回来之后,你从里边查的时候,你也会用到它啊什么意思回。
13:38
一下啊,之前我们是常讲过一个小例子,对吧?咱们以谁为例呢?当时我们是以那个card info那张表为例的,对吧?我们都知道card info那张表将来会作为谁,作为我们那个加购物车事实表的数据来源,对吧?那大家还记得我们怎样从这张表里去找加购的操作吗?还记得吗?得是类型,得是什么类型,IN3的类型,并且或者是up的类型,对不对?OK,那如果是up类型呢,还得保证你修改的字段是这个,还得保证他修改的值变大了,是不是咱们之前举过一个这样的例子,对吧?那从这儿你应该就能感觉出来,我从这张表的变更操作里边去拿咱们的加构操作的,你是不是得用type去进行过滤啊,对吧?诶是这样的,那所以说这个type,嗯,它是有用的,那所以说我们建表的时候,这个type字段是一定一定得保留下来的,诶这个要搞清楚好,接下来继续往下走,那TS要不要留呢?
14:31
要不要留,咱得知道它是干什么用的,对吧,是干什么用的呀,是一个时间窗对吧,指的是什么的时间呢。指的是什么时间?哎,这个TS呢,实际上呢,呃,指的是什么时间,取决于什么呀?取决于上面的类型吧,对吧?如果你现在的类型是bootstrap类型,好,那你这个TS指的是什么呢?是boottrap开始的时间吧,对不对,这个要搞清楚好那如果我前面是insidet,那这就是三的那个操作发生的时间,对吧?Update就是update操作发生的时间,Delete就是delete发生的时间啊是这样的,好,那现在问题来,TS到底有没有用?
15:08
我们将来要不要用它,其实可以用它,为什么啊,你对于那种insert或者是update,或者是什么delete这样的这个类型的数据而言,你说我这个TS是不是就能作为我这个动作发生的时间呀,对不对,换句话说,它将来能作为一个什么呢?是不是能作为一个我们这个业务过程的时间维度啊,对吧,没错吧,这个操作什么时候发生的,我TS就是什么时候,对吧?所以它是可以作为时间维度的,所以TS是有用的啊好,那接下来继续往下走,那TS也要留下来,那date要不要留呢?Date肯定得留啊,你光有个type有个TS,这有啥用啊,对吧,Date是肯定得有的啊OK,那当然这个date呢,实际上呢,针对于不同的类型,它也有不同的含义,没问题吧,对不对?那对于这种不tra insert这种类型而言,Data的含义是什么呀?是不是data里边的数据就对应我们那张表当中的一行数据啊,对不对,这是对于波特斯化因三的类型而言的啊,好,那如果这个类型是因三的类型呢?
16:09
那你这个指的是什么?是本次insert操作插入的那条数据吧,对不对?OK,那如果是update呢?是不是指的是我本次修改操作修改这条数据,而且指的是修改前还是修改后,修改后的这个要搞清楚啊,那如果说delete是不是就是删的这条数据啊,对吧?这个不多说,好,那date有没有必要留下来呢?肯定是有的吧,好了,那也是截止到现在呢,根据我们的分析,这三个字段我们是肯定得要的,对吧?那还要不要考虑其他字段,这俩不要,还要不要考虑其他的?这里边儿还有一个字段在这儿没有体现出来啊,哪个字来着。是不是就是old呀?对不对,因为大家都知道啊,就是类型,如果是update是不是才会有这个这个这个old呀,对吧?那关键问题来了,Old我们要不要保存在这个字段,这个这个表当中呢?要不要old,要不要还是那句话,要不要取决于什么,取决于我们将来用不用它,对不对,那用不用old呢?其实应该会用到的,哎,我们还是以之前就是加购车试时表为例啊,加购时时表我们前面提到过,你要想往加购时表里边去装载数据,对吧,你就得找什么样的数据来着,类型等于因色的类型,并且类呃呃,不是啊,就是类型,首先你可以是因色类型对吧,因色类型是不是在这张表当中对应的就是一个加构操作呀,对吧,还可能什么类型来着。
17:30
Update类型对吧?但是所有的update都是加构吗?不是对吧?你还得保证什么,还得保证就是首先你是update,还得保证你修改的字段是SQ number,还得保证什么?SQ number的值较原来相比是变大了才行,对吧?OK,你怎么样能看出来它的值变大了,变小了呢?你是不是得用修改之后的值跟修改之前的值进行比较啊对吧?修改之前的值就位于O的里边,所以说O的咱也得给它留下来才可以啊,所以说最终咱们就确定下来了,咱们这张表的字段应该是一共有这样的四个type ts date加old就完事了啊好,那现在呢,我们把这个最终的键表语句拿出来,咱一起看一眼就完事了啊来,CTRLC我拿过来,我就放在呃这个位置吧,哎,放在这啊,好的同学,咱们一起来看一眼啊,呃,那现在呢,首先先看它的表名ods card ino INC满足咱们的建表,呃,这个命名规范对吧,这个不多说啊,现在往下走看一下它的具体的这个,呃,什么呀,看一下它具体的这个表结构,那表结构呢,我。
18:30
是不是还是得分行和列,还有分区去看呀,对吧?我们现在先看行,但一定要注意啊,这张表它作为一个增量表,它的每行数据指代的是什么?这个比较关键,为什么呢?因为都知道增量表我们第一天做的是全量,第二天之后做的是增量,对吧?那全量我们是基于查询的,增量是基于blog的,那所以说你第一天的数据跟你后后边每天的数据,每行数据所代表的含义是不是不一样啊对吧?再强调一下,第一天的时候每行对应的是什么?是my sol当中是不是这张表的每行数据啊对吧?一行跟那边一行是不是就是对应的对不对?这个一定要搞清楚好,那到了第二天之后呢,每行指代的就不再是买思当中一行了,而是买思当中这个数据的一个变更操作了,对吧,是一个音色的操作,或者是update的操作,或者是delete的操作,是一个一个的操作了,对吧?这一定要注意它第一天跟后续每天每行数据所代表的含义不一样啊。
19:30
好,那完之后继续往下走,行情楚了,接下来就看列列,事实上就是根据我们刚才所说的,是不是一共这样的四个字段啊,对吧?关键这四个字段的类型是什么,咱们得确定一下,首先看type,这个就是一个基本数据类string就没事了,对吧?那TS呢,是不是一个实验桌用big in就搞定了呀,对吧?那OK,这个date呢?Data从这能看出来它是不是就是一个结构,呃是一个这个呃阶阶层对象对吧,所以我们在这用什么就行,结构体呗,对吧,这个没什么可说的,关键是old,这个old的咱们用一个什么样的类型保存比较合适呢?
20:03
OLDOLD在这个数据当中,它应该也是一个接森对象,对吧?那理论上接分对象我们应该用啥?结构体对吧,但是这个咱们能不能用结构体。这个就不好用结构体了,为啥呢?对,因为这个O的里边的字段是不确定的吧,没问题吧,OK啊,因为为啥,因为我可能一次修改,我修改的是俩字段,我我下次可能修改的是三个字段,对不对,那是这样的,所以说你这个字段不确定,那结构体你要想定义的话,你是不是必须得明确它的字段才行,那所以在这你用结构体是不行的,那用啥呢?哎,用map行不行。只能用map了啊,你只能用map,你用map的话呢,是不是,首先它里边不管有几个字段,我用map是不是都能存下来,这个没问题,但是用map会有另外一个问题,啥问题呢?就是类型的问题,对不对,那那那咱们也没办法,我们只能是用麦克,然后呢,将来呃,假如说我这里边存了一个什么类型呢?存了比如说存了一个int类型对不对,那完了之后呢,我到时候我有的是字符串,有的是int对不对,那我这怎么办呢?我统一用字符串保存对不对,那将来你比如说int我再给怎么样呢?再给它转回去对吧?哎,我想用它的时候,我再给它cast一下对吧?哎,只能是这么去操作了,所以最终呢,咱们就确定下来O的这个字段呢,我们就用map去保存,完了之后呢,Map的K和value统一都使用死锥类型就完事了,OK啊,那现在咱们一起来看一下。
21:21
来看一下我们这个文档啊呃,这个位置咱最终使用的是map,然后呢,KY6都是四类型,就这么个逻辑,这个大家一定要体会一下啊,行了,那截止到现在这张表的行和列咱就都说完了,最后分区,那分区呢,是不是还是分,还是按天分区就完事了,对吧?哎,仍然是一天一个分区,一天一个分区,第一个分区它存的是全量数据,后续每天存的是当天的,是不是新增级变化,相当于是对吧,这个搞清楚就行了,好了,那截止到现在这张表我们也就说完了啊好了,那这个完成之后,视频我停一下。
我来说两句