00:00
好,那现在我们看这个2.5这一节啊,2.5这一节也是我们这个采集项目当中的,相当于是最后一节了,那第三章就是做一个这个安装一个have,但是安完之后咱也不用啊,因为现在没有需求,需求得放到输仓去做了啊,这就是做一个准备而已,好,那现在我们看2.5,呃,这里边咱们第一节已经这个分析完了,相当于啊,那下来就是2.52这一节啊,2.52这一节呢,实际上我们要做的就是干啥呀。啊,就是去啊,你看这也看到了,是干什么,是编写一个脚本对吧?啊,这会儿相当于是干什么的,在在干啥呀,先在将我们导数据的任务,是不是给它封装到了一个shell脚本当中啊对不对,那这块给大家说一下,我们为什么要这么去做啊,为什么要这么去做。其实这个呃,道理很简单,嗯,大家来想一想啊,前面咱们提到过我们这个数据仓库呢,呃,咱们是一个从头到尾啊,咱们是有很多步骤的,对吧?咱们包括数据的采集,数据采集完之后呢,数据需要写到咱们的hfs对吧?到hfs之后呢,还得怎么办?是不是还得放到咱们呃那个have的表里啊对不对,那have呢,我们又是分层搭建的啊,咱们一层啊,一层一层一层啊,这是不是相当于从前到后,咱们这个数据仓库有这一整套的啊这个流程啊,相当于是啊,咱们这里边呢,是有这个固定的这个术语的,叫做work flow啊,其实说白了就是工作流程啊,工作流程,那工作流程它有什么样的特点呢?咱们来说一下啊,工作流程有什么特点,俩特点啊,首先一个工作流程呢,它肯定是由多个工作单元组成的啊,对吧,每一个咱们这每一个小方块,相当于就是每一个步骤就是一个工作单元啊对不对,那咱们整个数据仓库到时候呢会有。
01:44
很多步骤的啊,咱们第一步就是先导数据对吧,导完数据之后呢,把数据导到那个have当中,呃,Have里边先进第一层,再到第二层,再到第三层,再到第四层,再到第五层,那最后呢,出结果,把数据导到my sol当中,这是不是整从头到尾一整套的流程啊,啊是这样,这是第一点,得有多个工作单元组成,那第二点呢,还有一个特点是什么呢?是啊,每个工作单元之间是有这个前后的依赖关系的。
02:12
啊,这个咱们怎么理解啊,举个最简单例子啊,咱们现在是不是已经把数据,呃,要给它导到HDFS上啊,对吧,到了HDS之后,咱们要往哪导,要往have have的第一层导,对吧?要往咱们收藏第一层导,那你说这俩任务它前后是不是有依赖关系的,你是必须得等数据到了咱们的hfs才能从HTFS导到have里边啊,它是有前后依赖关系,必须前一个完成我才能哎去提交下一个对不对?那这是咱们这个数据仓库当中啊这个工作流程的概念,那这个工作流程啊,呃,是谁帮我去调度的呢?前面讲过是阿斯卡班给我们去调度对吧?啊,阿斯卡班调度,那阿斯卡班去调度咱们这个任务的时候呢,最方便的一种方式就是将咱们的各种任务全部封装到shell脚本当中啊,这是咱们使用阿斯卡班最方便的一种方式了啊,所有任务封装到shell脚本,然后阿兹卡文就负责干什么呀,负责挨个的来依次的去调用咱们写好的LL脚本是不是就行了呀?啊是这样。
03:13
这样的一个过程啊,那所以说哎,咱们把这儿呢,这个scoop导数据的任务呢,咱们也给它封装到一个shell脚本当中了啊是这样的,其实不光是它,那你后续你像我们到数据到了呃,Have里边,那咱们是不是一层一层的也要呃逐层去导啊往下边对吧,那这个导的时候其实就是执行什么呢。第一层到第二层,第二层这层,这这其实就是跑什么呀,最好。是不是就是circle啊,对不对,Circle从第一层查出来,然后写到第二层,第二层查出来写到第三层啊,这像这些circle任务的,我们到时候也要封装到shell脚本当中。诶,那我现在问大家一下,我怎么把一个have的circle任务封装到shell脚本当中啊,怎么写。那脚本里应该大致应该是怎么写呀。哎,对,是不是就是have-E或者是have-F都可以啊,啊是这样的啊,那这是我们后续大家需要做的,那也就是所有任务咱们全部统一封装到shell脚本,好放晒脚本之后呢,那让阿斯卡文去一次掉咱们这些脚本就可以了啊是这样的啊好,那现在我们就来看一看这个脚本啊,咱们怎么去设计它啊,怎么设计它。
04:19
嗯,OK,我们现在一共有多少张表,一共有20,呃几张表,20几张表啊,那这么多张表,那你说诶,我先把这个调成BA啊,啊那你说这么多张表,呃,那我们正常来说写这个死库,这个命令咱们得写多少个呀。这咱们你看一下这这个东西是不是就是说每一个这个库的任务只能导什么呀?是不是只能导一张表啊,对不对,那所以说你一张表是不是就得写一个这样的命令,一张表就得写一个这样的命令啊,那确实这样啊,然后但是咱们要是怎么弄呢?咱们要是在shell脚本当中啊,我写一个函数。啊,咱们三角脚本中写一个函数来把这个每一个表啊,它这个命令当中的公共部分给它抽取出来,公共部分比如说是哪,比如说你像这个东西不都是一样的对吧?那你像这个下边呃,这些东西啊,都是几乎都是一样的,那不一样呢?可能就是这些搜狗可能不一样啊,这个最终的路径可能不一样,但其他东西大致都是一样的,对吧?我们可以把这些哎公共的部分抽离出来作为一个函数,然后这些不同的东西怎么办呢?
05:24
啊,咱们可以在调用这个函数的时候,给它干啥呀,给它纯参数不就行了呀啊对,咱们这么设计实际上是比较合理的啊啊那接下来咱们就看看这个脚本哎,如何去哎实现啊如何设计好,咱们一起来先开个头吧,来我们井号,然后叹号啊并来BA啊写个这个,然后接下来咱们现在就先去写一下我们那个所谓的公共的函数啊公共函数那咱们随便起一个名字,比如说叫做诶port啊,Date啊来我们来一个这个诶括括号,再来一个大括号,好,那这就是我们SL当中,我们定义这个函数,那大家要注意啊,这个SL当中啊,咱们这个它是怎么运行的呀,这个善L脚本是不是逐行运行的呀,对不对,所以说那我们要想定义函数,你下边是不是要引用这个函数啊,那是不是必须得把函数写在前边啊,对不对应就是主行运行的啊,这跟咱们家那种不一样啊,把这个得搞清楚啊,那它在这个里边,我们把这个呃脚本先拿过来,这个LCTRLC啊。
06:25
调下来之后呢,放在这里边来,我们typeb键推一下啊,好,那这个就是我们这个函数当中的这个,呃,一些内容啊,这咱们函数内容,当然你给它放到头也行啊,无所谓,好,那接下来我们把这个公共的部分保留,然后那些啊,就是非公共的部分,咱们怎么办?咱们传参对吧?啊传参好,前面这几个肯定是一样的,没问题,Query这个得变一下啊,这个query咱们也写circle吧,也写circle,那所以说这个circle每个表跟每个表的circle是不是都不一样啊,都不一样,都不一样的话,那我们这儿呢,就可以以一个比如说Dollar。一或者是Dollar,二,这种形式是不是穿参啊,让大家注意啊。
07:02
注意什么问题,这个DOLLAR1啊,认定这个DOLLAR1,你说哎,它和我们那个,呃,Shell脚本当中是不是也有一个DOLLAR1啊,对不对,你说这个有没有什么区别啊,比如说我在这,我在外边也写一个E扣在到一。啊,这个能不能搞清楚,这个到一指的是什么。是不是指的是咱们调用脚本的时候给脚本传的参啊,对不对,那这个当是意指的是什么?只是我们调用这个函数的时候给他传的参,比如说我在这个代这个脚本当中,我在下边调用inport的哎,Thatt这函数啊,Daa代T函数,然后我给它传一个AAA,那是不是这个AAA就相当于是会怎么样啊,是不是这个函数里边的DOLLAR1就会解析成AA呀,对不对?所以这个大家这个作用意呢得搞清楚啊,作用意得搞清楚,行啊,这个指的是函数的第一个参数,这个指的是脚本的第一个参数啊,不要搞混了,行,那咱接着往下走,呃,那接下来是这个啊,这个conditions前面讲了这个,无论如何,这个conditions咱是必须得有。
08:04
啊,这个是必须得有的,那他要是必须得有,那咱们这是不是可以把它留在这个公共部分呢?对不对,要留在公共部分,那咱这可以做一个处理,该怎么办呢?我们这写个案呢?啊,因为下边咱们这个所有的circleq几乎都有啥都有过滤条件啊,几乎都有过滤条件,那都有过滤条件的话,那是不是正好是where,然后边拼上这个案子就行了呀,是这样的啊好,那咱们就先这样保留啊,如果一会有不妥的地方呢,咱们再修改啊好,那接下来是下边这个啊,Target给的dl target dl每张表跟每张表是不是都不一样啊,啊都不一样,那这个target给的DR怎么给它导在哪呢?诶,其实可以仿照咱们前面那个,呃,业务数据啊,呃,仿照咱们那个日志数据,那日志数据咱放哪了啊,咱们就给它放在一块,是在all data对吧,集贸log啊,然后to log,然后这里边的是日期对吧,那其实我们是不是也可以仿照他这种写法啊,跟着咱们拿过来。来CTRLV放在这data集毛只只不过咱这次不能叫log了,对吧,咱叫啥叫DB啊,业务数据,那这里边写什么呢。
09:08
是不是放放一个表名是比较合适的呀啊一个表名,那表名的话是不是每个每个这个表它的表名是不是都不一样啊,所以它怎么办也也传参对吧?啊也是咱们来一个Dollar几,比如说DOLLAR1啊Dollar dollar2吧,这回得啊俩参数啊Dollar哎可以对那或者说我们呃,因为这个circle一会咱们传的时候太长了对吧?啊那所以说咱们可以给大家换一个啊这个circleq咱们放哎后边啊这个表名了,咱们给它放前面啊这样一会写掉这个函数的时候比会比较方便啊好,这个到时候一这个二啊好,那关键是后边该写该这个日期了,对吧?呃,因为咱们这个SCO导出去的时候,咱们也是每天都要导一遍,每天都要导一遍啊,那关于这个日期咱们怎么处理。哎,那这时候咱们就得跟那个谁呀,跟咱们的呃F去做一个对比了啊,你看咱那个日期是怎么做的。
10:04
啊,咱们呢,它那个路径可以写那种什么转移序列对吧,它能够自动的,哎,给你分成不同天,然后给你把数据存起来,对吧,但是这个库啊,诶你分析分析它跟鲁有什么不同。看不懂。首先啊,咱们先从呃,他俩这个本质上来说一下,那本质上我们flu实际上你启动的是一个进程,这个进程会一直运行,对不对,它会迟迟不断的往HDM写数据,哎,这是F,但是死库不呢。我根据磁school底层原理,此school底次是MR,对吧?你每调用一下那个命令,那是不是就是相当于提交一个MR任务啊,对不对,那也就是说每次是不是就是导一批数据到咱们的HS上啊,啊,它不是一直运行的啊,既然它不是一直运行,那你说这个命令咱们是不是应该每天都要调一次啊,对不对啊,能这个能理解不?你要flu嘛,咱们启动一次是不是就一直不断的采集往上面传就行了呀,但是它不行啊,它是只是哎,你执行这个命令,那那倒一批数据,那就停了,就结束了,然后到了第二天是不是又有新数据了呀,那是不是你还得再重新执行这个命令,再倒第二天的数据啊。
11:14
啊是这样的啊,也就是说实际上这个路径啊,哎,他得每天都得变才行,对不对。啊,那你比如说我今天调这个脚本的时候,那你的日期就应该是,呃,昨天的日期就应该是九月15,那到了十六十七号的时候呢,那我再调你的时候,你这个日期啊,你就得变成九月16才对,对不对,因为咱每天是倒前一天的数据嘛,啊哎,那你说这个东西咱们应该怎么处理?啊,这个日期只能咱们自己维护了啊,只能自己维护了,那怎么办?咋维护?这个得是一个能自自己变的对吧?啊,根据你调用它的日期啊,他得变一下啊,今天调的那这个日就得是昨天的,因为我每天导前一天的日期啊,前天的数据。啊。这个怎么处理?
12:00
那很显然,我们这儿应该肯定写死是不行的,应该怎么办?是不是应该来一个时间变量啊,然后这个时间变量它能够自动的,诶每天获取前一天的日期,这是不是就是比较合理的呀,对不对?那这个时间变量咱们怎么整啊,比如说我在脚本当中,Cel脚本当中,咱们是不是就可以来一个Dollar,比如说随便来一个啊呃,Dollar date就是一个呃,执行日期啊,一个日期,那比如说我这呢,后边是一个这个呃,每天能够自动获取它前一天的日期,对不对,那咱们就把这个到l do that ctrl c,诶是放到这个位置来CTRLV啊,那这个日期是不是就每次调用它的时候,它都会自己去找一个昨天的日期啊,啊,是这样的啊,那现在问题是这个do date,咱们应该怎么写?啊,我想获取当天的日期,会不会获取。直接data是不是就行啊,那咱们直接date dat,这就是当天日期啊,但是它这个格式可能不是咱们想要的对吧?啊格式可以进行格式化的,但是我现在要获取的不是今天,我要获取的是昨天的日期,对吧,昨天日期怎么获取?
13:06
哎,咱们可以看看这个date的help命令啊,Date-her啊,然后再看一下往上翻。哎,先看一下这个date它的使用使用方式吧,那它的用法有两个,一个是上面这个,一个是下面这个,那咱们就看上面这个用法啊,上面用法是date加选项啊,在选项,那选项指的就是options,指的就是就是这一大堆东西对吧?这是它的选项,就是杠什么杠什么杠什么,那后边呢,还有加格式,这个格式在干什么呀?是把日期进行格式化对吧?啊,那加格式怎么用?哎,下边这是你的格式啊,你比如说我现在呢,加什么东西,加一个这个,呃,加一个它吧。啊,加一个百分号D,那它返回来就是。这写了什么按月计算的日期,什么零一什么的啊,就是相当于天对吧?啊就是天啊几号,那比如说我在这呢,加一个什么百分号杠杠S,那这个就是啥呀,会把你的日期给你转成。
14:02
时间窗对吧?人时间砖,那也就是说实际上这是格式化用的好,那接下来咱们看看我们要想获取昨天的日期,咱们怎么获取好,我们要想获取昨天日期应该看选项对吧?咱们看第一个选项第杠D-D后边描是什么,看一下。Display time described by string,这个string谁相当于是杠D后边你是不是需要给他传一个字符串啊,对不对,也就是说,哎,它会啊,展示展示什么,展示你这个字符串所描述的时间啊,Not now,而不是当前时间,也是正常情况下你这个DA返回的是当前时间,对吧?那如果说我加一个DA啊。然后杠B,然后后边呢,我给他来个字符串,然后字符串里边呢,我去描述一下这个,呃,一个日期,那它返回去就就是不是就是你描述的日期啊,对不对,那现在我要获取的是哪一天,是前一天,那昨天昨天怎么获取,怎么描述,你不能写昨天得写英文对吧?英文昨天怎么写啊。
15:05
Yesterday对吧,那看行不行啊,Yesterday。来,你看返回的是不是昨天日期。对吧,16这15,那说明它返回就是昨天日期,那那返回前前那个前天呢。前天咋写啊,那好像就不太好使了,什么对比分yesterday对吧,但是就就太长了,不能那么写,那咱这其实有固定这个啊,这个公式的有固定写法,那怎么获取减一对啊,那这个获取就是昨天,那那前天呢,就是减二类啊,那明天的那就是就是加一或者是不写也行啊,直接2DAY或者是1DAY,那就是哎明天或后天啊,是这样的啊,那咱这要获取的是哎昨天的日期,那很显然就是减1DAY呗啊减1DAY啊,但是咱们这个日期我们不想要这种格式对吧?咱们格式应该是什么样呢?是不是跟这个统一啊,咱们叫年杠月杠日对吧,那也是我们需要给它进行一个格式化啊,那格式化咱们用哪个命令?
16:04
Cover一下,那是不是应该用这一大堆东西啊,对不对,那我们就得找一下那个年月日年是哪个年,年是哪个年是这个,呃,他2%杠大Y对吧,那月呢。月是百分二杠小M,然后D呢是百分杠小D对吧,那坐在这应该怎么,是不是应该是这样去写,来后边来一个得有一个加号啊加号百分号啊Y,然后杠百分号大小M是吧?啊然后杠百分号小D回声哎,这就是年杠月杠日,而且那是昨天的日期对吧?啊做日期后期这你可以简化一下啊简化一下怎么简化,你看啊,咱们这这里边有一个百分号。呃,F,你看那个。啊,完整日期格式等价于YMD是不是就是咱们直接写百分之号大大F就行了,对吧?哎哎走哎效果是一样的啊好,那这个呢,就是我们在这给大家介绍的这个获取昨天的这个日期的这个命令啊好,那咱们是不是正常情况下把它给的就行了呢?这样给的行不行啊,当然这但是不能有有刀刃啊,咱们这相生物变量,那你这样直接给他行不行?
17:13
给他行不行?行不行,咱们测一下呗,对吧,那我把这个粘出来啊,我放在这儿啊,那我直接给它啊,回车首先就直接报错了,对不对啊,这是怎么回事啊。这怎么回事,这显然你想一想,这相当于什么,相当于是啊,我这个咱们shell当中有有一个东西很重要啊,啊就是它这个空格啊,是很重要的啊很重要的,咱们现在相当于什么给do delete赋值对吧?然后呢,这个连着的有一个date,他是不是把直接把这个当一个字符串赋给他了呀,那后边这个空格是不是就相当于哎,又传了一个什么杠D啊,这相当于跟跟那个data是分开的了,对吧?那所以说诶你这样它肯定是不能识别的啊,不能识别的。啊,那咱们要想把这个东西来给这个返回的结果给这个do,那咱们应该怎么处理啊。
18:04
啊加引号对吧,那加引号我加什么引号呢?单引还是双引,双引试一下啊来双引。那我们再E扣一下,然后这个Dollar do dat。啊好,把这个字符串给他了啊,那加什么加单眼行吗?单眼更不行了啊,单元更是原样原样给他了对吧?啊那更不对了,优先级啊优先级来先试一下啊,诶这个怎么回事,这一套啊,然后呢,未找到命令对吧?啊,它这里边是因为什么?因为咱们有单引号这个嵌套了对吧?啊,所以还是不行,反正就加引号就不行啊,那加啥呀,所以这会给大家暗号也不行啊,这会给家引出一个新的这个引号叫做啊标号或者叫做反引号啊,就是在咱们键盘上那个对左上角ESC下边或者tab键上边啊标号咱们管叫标号或者是反引号,那这个引号它的作用是什么呢?它的作用就是将你这个命令这里边是不是一条命令啊,将你这个命令的输出结果啊,然后返回出来,然后付给我们前面这个变量。
19:11
啊是这样的,你加双引或加单引,它都会把这个东西当成一个字符串的啊,所以说这次咱们再来试一下回车,然后呢,再eo这个到delete,诶咱们就能够正常的赋值了,所以这个反引号大家得知道是干什么用的,或者说我们这呢,也可以用这个去写啊来还有一种另外的写法,叫做Dollar小括号。啊,跟它的作用是一样的啊,也是将这个命令啊,这个执行完之后,将结果赋给前面那个那个变量啊,回撤效果是一样的啊Dollar小括号来或者是反引号,这俩取二,二者取其一就行了啊来我们复制。好,那这时候咱们是不是就可以这样去CTRLV,诶把这个do date拿到了呀,那大家想一想啊,那我们把这个do data放在这儿,那你说我是不是正常情况下,咱们这个脚本每天需要被重新的调度,重复的调执行啊啊每次执行的时候,那其实你放到的时候都是昨天的路径里啊诶这是诶诶非常不错的,非常不错的啊好了,那这块相当于我们就完成了这个功能了,那接下来再往下走,下边这个它delete他DR,咱们给它留着吧啊然后number maps这个咱们实际上数据量很少,呃,咱们这就不起这么多map了,就写一个就行了啊你那这要是一个的话,那下这个还用写吗?啊,这个不用写了,可以删掉啊,但是这个删了的话呢,呃,那上面这个反这个换行符就不能有了呀,最后一行是不要不要不要加换行符,最后一行不要加换行符啊,要不然他就会以为你这个没有结束啊好那啊哪个。
20:40
呃,加双引号哪个位置。他给的点,你说这需要加双引号,为什么这要加双引号呢。有道有道一就得加双引号吗?不是,嗯,你不加引号肯定会解析的啊,然后要是加引号的话,是双引号里边会解析,但是单引号里边不解析,你不加引号它肯定解析。
21:06
能理解吗?啊,不是说非得加了双引号才解析啊,不是这个意思啊,啊,那这个我们大家呃,它差不多写到这个程度就可以了啊,但实际上这块呢,我们只是这个基础功能能够实现啊,基础功能能够实现,但是有些东西我们还得再给大家加一点东西啊,什么东西呢,我们看文档啊。来,哎,主要就是这俩参数,咱们得看一下啊,CTRLC。来放到啊这个地方,这还得加个快放啊CTR位啊,我们这又加了几个参数,是不是又加了四个参数啊啊加了四个,这四个咱们分为两组啊,一个一个说一下,那这俩参数应该都都能看懂,这什么参数是不是杠杠comppress啊啊就是是否压缩,加上它就会压缩,那压缩的话是不是得加上一个压缩的格式,咱们采用拉罗P,这个是不是跟咱们鲁那边保持一致啊啊这个应该能理解好,那接下来就是下边这俩参数啊。
22:00
这俩参数呢,相对来说是比较重要的啊,这个有什么?No string no none string,对不对?那这俩参数好像是跟我们那个空值有关的,对吧?啊,跟空值有关的这个指的是什么啊?来给大家说一下,我们买SQ,咱现在是不是咱们需要把买搜Q的数据导到HTS啊,那买搜狗当中我们有什么值,会有空值啊,会有空值哎,那你试想一下买搜Q当中的空值啊,我导到HDFS上啊,我应该如何处理?这是不是咱得考虑一下呀,对不对啊,那你考虑呃,你你想让它存成什么呢?买收率估值,你想让它存成什么呀。你应该让他存成什么,或者说?这是不是得跟后边的have相关呀,对不对,因为咱们数据导到hfs上之后,不是说就完事了,咱们后期这个数据是不是要交给have去,诶这个呃,进行磁后查询呀,对不对?那既然是这样的话,那咱们就得保证什么,保证这个空值写到hfs上之后,后边我导到have里边,Have得能够识别才行,对吧?啊,那have它所识别的空值是什么呀。
23:09
还有控制底层存的是啥呀?啊,这个不知道吗?是不是杠大N呢。反斜杠大N。啊,这个不知道是吧,啊行,现在知道了吧,啊现在知道了,记住啊,就是我们have当中啊,里边的空值在它的H文件里边,它存的什么呢?是反斜杠大N啊,这是氦它所能够识别的空值。啊,它所能设置十倍的空值啊,好了,那既然是这样的话,那你说我们是不是应该就保证我们买SQL呃里边的空值哎,写到HS上之后得存成什么呀?得存成反斜,反斜杠大N才可以啊,那这样一来我们have就能识别了啊,主要是这个作用啊,那如果说这个咱们不加这个参数啊,就是不加这俩参数,那默认它会把空值存成什么呢?会存成小写的这个note字符串啊,它会把它当成一个字符串,但这个note字符串have它能识别吗?
24:06
是不能识别的,你比如说我们执行一个have circle啊,Where固定条件,比如说select,什么什么from,哪,Where ID is not。对不对,那如果底层是一个no字符串,你说它能识别吗?那识别不了啊,它只认这个反斜杠大N啊,把这个记住就行了啊好了,那这会完之后呢,那再解释一下这俩参数分别指的什么意思啊,怎么有一个no string,还有一个no nu string呢?什么意思啊,这是啊,来解释一下,对,这个是字符串类型的,这个空值我存成什么,这个呢是呃,非字符串类型的啊,我存成什么?那咱们字符串和非字符串类型控制的我们全部存成诶反斜杠纳N啊,反正纳这个呢,其实在我们此库的官网上也有详细的说明的啊,详细的说明好了,那咱们正常情况下应该是不是存成反斜杠大N就可以了呀,那为什们咱们前面又加了一个反斜杠呢?
25:03
这个反应杠干什么用的呀?哎,是转义的啊,是转译的,因为咱们词库吧,底层是mmr对不对啊,Mmr咱们它底层其实也是加va语言啊,也加也是这些参数,你最终是不是都需要传到哪啊,传咱们加va代码当中对吧?那加va当中反斜杠这个东西是不是一个特殊用来转移的一个字符啊,对不对,那所以说咱们是不是还得把反斜杠给它转移一下才可以啊啊这是大家得注意的啊,所以说我们这需要写两个反斜杠啊,这个其实转的是哪?转的是我们加代码登录啊,啊把这个记住就行了啊,那到目前为止,咱们现在这个呃参数呢,相对来说就比较丰富了啊,就已经基本上足够了,好,那接下来我们就来往下接着写啊,接着写,咱们现在相当于生明了一个时间变量啊,然后这边呢,我们定义公共函数啊,那再往下咱们这个脚本应该怎么去往下写呢。当那现在写完了没有写完对吧,我们只是声明了一个函数,你这个函数,你假如我现在去执行这个脚本,这个函数会执行吗?不会,你只是声明了没有调用对吧?咱得调用啊,那现现在我假如说我现在想调用order in for这张表啊,假如我想调order in,那你说咱们这应该怎么处理啊,是不是应该是调用上边import date的函数了,对不对,那咱们是不是得给它传一个什么东西,传一个这个这个第一个参传俩参数对吧?那第一个参数咱们是什么?是写到HDFS的路径对吧?那路径我们就以它的表明命名就可以了,那比如说就是Dollar,呃,一到了一应该传谁应该传一个,比如说order in for,哎,完事了啊,那接下来第二个参数是啥?
26:38
月二参数是不是应该是啊这个是到那是一个circle啊对吧,这个circle,那咱们这个circle怎么写呀?啊注意啊,这个circle呢,你必须得在这一行里边,说你不能回撤啊,有同学来我这个circle狗换一行写吧,那这还行吗?不行了,对吧,相当于你这一行这个命令是不是结束了呀,你这个circle狗自成一行是不是自己变成一个啥了呀,自己变成一个这个呃这个命令了,对吧,那肯定是不行的,所以必须得在一行里,或者你要真想分开怎么办?写换行符是不是也可以啊啊好,那咱接着写啊,那这个circle我们呃要写的话是不是就正常SE select哎,比如说我有什么ID啊哎,我有什么这个price啊呃,有什么这个这个AMT等等的,把这些字段是不是都选上,选上之后呢,我们from,哎,就order,哎,In inform或然后后边呢,我们需要加哎,Where过滤条件啊,Where过滤条件哎等等等等,写上之后,那是不是这个circle,哎就能正常传到咱们函数里边来,跟你后边的and Dollar conditions是不是就拼。
27:39
成一条完整的色了呀,对不对,就是这样的啊,就是这样的,好,那这样一来大家想一想,我们假如说现在把这个脚本咱们写完了,写完之后呢,去执行这个脚本啊,去执行这本这个脚本,那是不是正常情况下,咱们这个数据每天就能诶这个去执行这个函数去导这张表了呀,啊是这样,但是我们现在有多少张表啊,我们一共有20多张表,那所以说这个引号的这个函数咱是不是得调用20多次才可以啊,啊是这样的啊,这是咱们这个最终这个脚本的这个写法啊,这个写法。
28:09
好,那差不多呢,就是就说完了啊,差不多咱就说完了好了,那接下来之后呢,我把咱们这个脚本就给它放在这儿了,呃,现在接下来干什么?打开咱们文档,把文档上这个,呃,大脚本咱们拿出来这么多表,咱们就不一个一个写了啊,这个太浪费时间了,我们把这个脚本粘出来,然后给大家,呃,解释一下这个表里边,把这个脚本里边啊,它的所有的内容啊,然后给大家说一下这个脚本咱们怎么去使用啊。好,那我现在新建一个文件啊,脚本的架构就是刚才咱们讲的多少行啊,400多行啊,这个还行吧,啊后边咱们一个搜索就有好几百行的啊来咱接着走啊,其实你别别胆小,全是什么呀,全是全是字段的,你看一行一个字段这玩意对吧,其实也没多少东西啊,这脚本看着长,但很简单啊,很简单,那接下来呢,我们就给大家来演示一下啊呃,来来讲一下这个脚本它的这个全部的内容啊,首先我们现在先看一下啊,咱们这个上边声明的几个变量啊,这边首先我们先声明了一个这个Dollar APP等于机报啊,这个实际上就是我们那个相当是我们呃呃什么东西啊,就是随便生成一个变量啊,因为我们那个呃,HTM路径里边是不是用到了什么那个机贸啊,对吧,我路径就是有可能会变啊会变,那变的话我直接改变量就行啊,这个其实无所谓啊,这你甚至你不改直接写死也行啊好再来看下面这个。
29:32
啊,这这个SCO,咱这相当于什么呀,是不是声明了一个绝对的啊路径啊object module啊school,并找到school那个脚本啊,也就是下边你去使用它的话呢,这个库port,你是不是就可以直接引用这个变量了呀,现在就是绝对路径引用啊很简单,好,那接下来看下边这个。下面你看啊,它这个相对来说要复杂一些啊,怎么复杂了呢?其实这是不是也是好像是在处理咱们这个do do date呀,对不对,你看它是怎么处理的啊啊,那首先啊,我这儿呢,先做了一个if判断,If on n啊,然后后边呢,有一个什么刀二,对不对啊,这是在干啥呀。
30:10
还记得杠N是什么意思吗?杠N。啊杠N呢,哎,其实是指的什么是杠none zero啊none no n,然后那个none zero啊none zero什么意思啊,就是相当于是非空啊非空啊,那跟它相对的应该是什么呀。就是zero呗,一个none zero一个一个zero对吧?啊就是一个非空一个空,那它哎相当于是在做非空校验啊,那如果说你这个DOLLAR2啊是非空的啊,就是不为空,那这个if啊,就相这个相当于什么呀,是不是就相当于是啊相当于通过这个校验了呀,那执行的是哪个,执行的是不是这个代码啊,对不对啊,如果说是这个是空的,就是你这个到链是空的,那我执行的是不就S这个代码啊,啊是这样的,那其实相当于这块在干什么,这个到链是啥?是不是指的是咱们这个脚本的第二个参数啊,啊,注意是第二个参数啊,这个注意是第二个啊第二个啊,那也就是说,哎,这个脚本第二个参数啊,你传了啊,你传了你传了第二参数,那这个do do类就等于啥?
31:14
就等于你传的参数,如果你没传没传是不是就是就是空的呀,空的那这个do date就等于什么,就等于前一天的日期对不对啊,实际上这边相当于给我们开放了一个接口啊,什么接口就是说我们实际上啊,是不是可以通过在调用脚本的时候给他传参来指定这个Dollar date呀,对不对啊,那其实正常情况下咱们需要传三吗?假如这个脚本我需要交给阿卡文调度了,那需要传三吗?正常不需要啊,让他自动获取前一天就行了啊,但是我们可能会有这样的情况,假如说某一天的任务失败了,我我就想重新导某一天的这个数据,那这时候就怎么做啊,咱是不是就给他传个参就行了呀,啊是这个意思啊,所以这个呢也好理解啊,其实跟刚才咱们讲的没啥区别啊,就是还是导好,那接下来看下面这个公共的函数。
32:01
啊,这个公函数呢,实际上来跟我们刚才写的也没啥太大区别,Port data,然后词库port,然后这里边呢,我们加上这样的几个,这个connect username pass,密码我得改一下,改成123456啊然后然后他给的DR,你看他给的它是不是也是这样做的呀,一啊,然后呢,后边来一个这个相当于一个时间对吧?啊然后下边底类的TR它也有,然后下边这个circle呢。是不是跟刚才写的一样啊,然后下边哎,就全部都一样了。啊,这是它的公共函数啊,然后它的公共函数呢,好像跟咱们那个呃,参数都一样,但是它下边呢,还有一行。对不对,是不是这个函数还没完呢,下边还有一行对吧?这一行是在干什么?大家看一下海渡旁这儿,然后呢,指向看它指向谁了,指向那个拉泽罗的炸包了,对吧?然后后边呢,传了一个拉泽罗里边专门用来建索引,诶跑哪去了,专门用来进索引的一个权利名,对吧,对吧?然后呢,指向什么?指向这个路径了,这个路径就是哪个路径。
33:08
这个路径是不是就是刚才你上传到的那个路径啊,啊,这相当于什么,这个函数只要一执行它就会干什么,会做两件事儿,数据先导到HT上,然后呢,对这个数据干啥,键索引啊键索引诶但是咱们那个库和键索引么。不,不是school咱们那个flu键索引的吗?好像没有,咱们只是把数据导到了hfs上去,然后就完事了,对吧,没有线索引啊,那那没有线索引也没事,为什么呀,那咱们当时没见那是倍有键呀,你把它导到have当中再建是不是也来得及啊,对不对啊,这个大家不用着急啊,因它因为这边呢,我们呃在这写的这个函数,所以说建索引比较方便,那直接就把这个建索引的工作就放在这儿了,但是你这个索引在哪建其实都无所谓啊,只要保证进到have第一层之后有索引就行了啊,那咱们那个flu到时候再见也不晚啊啊,那这个就相当于是啊,这个函数一执行执行两个功能,一个是导数据,一个是键索引。
34:07
啊,好,那接下来再往下看,那按照我们刚才写的,我是不是公共函数写完之后,我下边就直接那什么直接调用函数了呀,对不对,但是这个脚本它没有,它又干什么了呀,它又封装了一层函数,你看啊,这有一个什么import order in for这个函数专门用来干什么的呀,专门用来导order ino啊对不对,那下面的啊,还有一个什么inport的Co柚的,这是不是用专门用来导咱们那个优惠券的呀?啊那下面那个专门用来导这个订单状态流水表的啊是这样的,但其实它这个函数里边,你看它干啥了啊,啊以它为例,在函数里边是不是就是执行那个什么inport date啊,然后表名传递一个参数,然后circle是不是第二个参数啊对不对,Circle就是从里边选各种字段,然后呢让每张表,然后下面再加诶过滤函数,再加那个Y过滤啊,是不是跟刚才咱们调用函数的方法是一样的呀,啊,只不过就是它将每一个表都封装到了一个函数里边。
35:00
啊好,那都封装完之后,我们应该有20多个函数就写完了,对吧,那咱们接来接着往下走来往下拉往下拉,看着右边的小地图啊,往下拉来,你说。为什么不用载星?因为我们可能不需要所有字段啊。啊,那有些字段我们可能并不需要啊呃,应也是可以的,可以的啊,可以用啊,啊来那咱们接着往下走,但一般也很少用简来形啊,小单形一呢是呃在尤其是在咱们have当中啊,当然这个是在哪执行,是在SMYS里边执行,对吧?啊呃,尤其是在have里边啊,咱们因为采用的历史存储,所以select星呢,咱们基本上很少用,而且你写来星啊,呃就是不太好看啊,不太好为什么你你假如说我想看一看我都导了哪些字段了,你是不是看不出来呀,对,但是这个S导哪个字段呢,这样一看一目了然啊,所以说方便咱们去修改啊,或者是去维护啊等等这些工作啊,就是尽量避免用三角形吧,啊一个一个相当于一个常识啊好,那现在相当于我们定义了二多函数,咱们拉到这了,对吧,看接下来咱们干啥了啊,接下来我们这是不是有一个什么K,哎,DOLLAR1对吧,这是不是在判断第一个参数啊,这个DOLLAR1应该是指的是谁。
36:12
是函数的第一个参数还是脚本的,这次是脚本的了,咱们得看作用域,它这个判断是不是直接位于咱们这个脚本最外层啊,对吧?啊,这个得得搞清楚啊,这个没有在函数里边行,那这个相当于判断第一个参数是啥,如果第一个参数是order in for,那我就调用import order in for啊这个啊,这个函数那是不是就导的是就是O引O这张表啊,啊,那你传哪个表名,我就到那张表,实际上是这个意思。然后再往下来,咱们接着往下拉。来来来,那这是不是相当于有20多个判断啊,那下边,哎,这咱们有一个什么first。如果传的是first,那我这相当于干什么呢?是不是执行了一大堆的inport的函数啊,对不对,那下边还有一个参数哦啊哦,下边的也是一大堆的音泡。
37:01
啊,那这个first跟O到底是什么意思,以及它俩有什么区别呢?来给大家解释一下啊,大家想一想,我们这20多张表当中,是不是有两张表是特殊的表?哪两张表,一个地区一个省份,那两个表是不是咱们因为它不会发生变化,所以说我们只导一次就行了呀,对不对,那所以说我是不是应该是呃,只在我们第一次导数据的时候啊,需要去导那个地区和省份表,然后从第二天开始,后续每天重复执行的这个工作里边是不是就不应该再有咱们这两个特殊表了呀,对不对?所以咱这区分的一个first就是首次导入和哦,这个指的是后续每天重复导入。啊,这是每天都要导的啊,那相当于这里边呢,就诶跟上面这个相比就少两张表啊,是这样的啊啊,那这个相当于就把咱们这个大脚本就介绍完了啊,那介绍完之后,那这个脚本咱们到底应该怎么去使用呢?后续应该怎么使用啊,这个脚本假如咱们起个名字随便起啊,比如叫做什么my circle啊,To啊,这个HDFS.sh,比如说这咱们这个脚本的名字,后续我要想用怎么办啊,首先我得传一个参数,那如果说是第一天导,第一天导是不是所有表都要导,咱们应该传上first fire SD,那后边呢,日期怎么办?
38:20
日期如果是我们是测试环境对吧,测试环境我可能数据是咱们自己造的对吧?啊,那你造的哪天,你是不是传哪天日期就行了呀,比如说咱们这儿我造的是5月15号了,那我就传一个2020杠零五杠,那要五是不是它差不多就行了呀,对不对,那假如说我要传的是一个什么呢?我传我我假如说我是那个后续每天重复执行的呢?那是不是应该传all了呀,对不就传O要是每天重复执行,那日期正常情况下还传吗?其实就不传,要自动获续前一天就行了,对吧,就相当于线上线了啊上线了相当于啊是这样的啊啊这是咱们这个脚本的使用方式啊行,那接下来问答一个小问题啊,咱们这个Dollar诶看这。诶这啊这个为什么呃非得用非得这这个表明,或者first all为什么非得作为DOLLAR1,而上面咱们那个日期呢?诶咱们非得到了二,你看正常情况下,我这个他是不是在前面啊,那跟他说,哎,为什么我这个写到了一不行呢,下面那个座位到了二为什么不行呢。
39:18
啊,为什么一定要踏实导了。琢磨琢磨,这个能不能琢磨明白。啊,对,没错,就是这个意思啊,因为DOLLAR2咱们有时候可以是不写DOLLAR2的,对吧?什么意思啊,日到在咱们这指的是那个日期对吧?啊,那正常情况下咱们是不是不传日期啊,啊不传日期那我只传一个first或者哦,那咱咱们假如说咱们反过来啊,日期我放在前边,也就是这个呢,咱们作为到一啊,那如果你不传日期的话啊,那是不是相当于脚本完后不传日期,不传日期是不是后边那个表名就跑前面来了呀,表名是不是就变成第一个参数了呀,对不对啊,那所以说你这个你不能用到二一,它只能到了二。
40:01
啊,因为保证什么呀,因为它是可写可不写的,所以你给它放在后边啊,它不会影响前面这个参数啊,反过来就不行了啊,所以这是大家需要考虑的一个小问题啊行,那这一点完成之后呢,咱们相当于整个脚本的这个大架构,咱们就完成了啊好,我把视频录一下。
我来说两句