00:00
好,那上一节呢,我们已经明确了每张表的同步策略了啊,那接下来呢,我们要做的就是为每张表去编写一个scoop的同步命令啊,那scoop的同步命令大家还记得怎么写吧?啊,是不是就这样写呀?那实际上呢,我们要做的具体工作其实比较简单啊,主要就是以这个命令为模板啊,然后呢,去分别修改query和target DLL参数,然后大家要注意啊,我们只需要修改query和target d就可以了啊,其余参数呢,都不用修改啊。因为我们只需要通过query后边的搜语句就能够明确我们要同步的是哪张表当中的哪部分数据,对吧?啊,然后呢,再通过target DR去明确我们同步数据的目标路径啊,那这样一来呢,我们就能够将不同表的数据写到HDFS不同的路径了。然后还有一点大家也要注意一下啊,就是我们需要为每张表都准备两个scoop同步命令,诶那为啥是两个呢?啊这个我给大家解释一下啊,大家都知道我们不同的表呢,会采用不同的同步策略,对吧?有的会采用每日全量同步,有的呢会采用每日增量同步啊,那还有的呢,会采用每日新增级变化同步对吧?但是啊,不管这张表它采用的是哪种同步策略啊,我们第一天去同步这张表的数据的时候呢,都得采用全量同步,然后后续每天呢,我们再去采用诶这张表它适合的同步策略,那我们为什么要这样做呀?啊其实这个道理呢,很简单啊,因为业务数据库当中啊,一般情况下呢,是会存在历史数据的啊,那所以第一天呢,我们就需要先将业务数据库当中已存在的全部数据一次性的给它同步到数据仓库当中,然后从第二天开始,诶,我们再根据不同的同步策略去同步每张表新增的数据。或者。
01:49
变化的数据啊,是不是只有这样我们才能够保证数据仓库当中的数据和业务数据库的数据是一致的呀,对吧?那所以说每张表啊,那当然说的准确一点呢,应该是采用每日增量同步和每日新增级变化同步的表,对吧?那它就得有两个scoop同步命令,因为它除了得有一个每日增量同步的命令,哎,或者是每日新增级变化同步的命令,对吧,那还得有一个全量同步的命令,用于第一天的全量同步,对吧。
02:18
OK,那接下来呢,我们就可以开始编写死库命令了啊,那咱这儿呢,一共有20多张表啊,我这儿呢就挑一个啊,然后呢,以它为例,给大家演示一下这个死库命令到底应该怎么写啊,我们就选择order info吧,啊,就是订单表对吧?那按照我们之前的规划啊,这个order info表它采用的同步策略应该是谁呀?啊,是不是应该是新增变化呀,对吧?大家看一下新增变化里边是不是就有这个order INF啊,那所以说呢,它是不是一共需要两个SCO同命令啊对吧?一个是全量,还有一个呢,是新增级变化对吧?啊,那现在呢,我们先写全量啊好,那现在呢,我把这个CTRLC给它复制一份啊来,我放在这边ctrl v OK,那现在我们要做的是不是就是改一下这两个参数啊对吧,一个query,一个target DR啊那现在我们先改这个query啊好,那首先呢,我们先把这个表名改一下,对吧?首先需要先给它改成older info。
03:11
好,那表名改完之后呢,我们再把前面选择的字段也改一下啊,那一般情况下呢,我们选择全部字段就可以了啊,所以在这儿呢,我们直接给他来一个select的星啊,来来星,好,那完之后呢,我们再看一下后边的过滤条件啊,那这个过滤条件咱要不要改呀。那肯定要改为啥啊,因为我们现在写的是啥是全量同步命令对不对,那所以说我们要的应该是全面的数据对吧?那所说这个ID大于等于一,小于等于20必须得去掉啊,然后还有一点需要注意啊,就这个Dollar conditions,就是不管我们这有没有自己的过滤条件,那这个dollars都必须存在,那当然啊,无论如何这个S的语法咱们都得遵守,对吧?那现在咱是不是只有这样的一个过滤条件,那所以说我们这个and是不是就得删除啊,对吧,这个一定要注意一下啊,好了,那咱这个query参数就算是改完了,那接下来呢,我们再去修改一下这个目标路径啊,这个目标路径呢,咱们就暂时先给它改成older info啊。
04:07
但是大家要注意一下啊,因为我们业务数据库当中的数据啊,他每天是不是都会有变动啊,那我们后续是不是每天都要把这个变动信息同步到HDFS上啊,那我们为了把每天同步过来的数据给它分开啊,在这儿我们最好在路径上面给它加上一个日期,对吧?那这样一来呢,我们就能够把每天同步的数据给它放在不同的路径了,比如说我们同步数据的第一天的日期是2020年的6月14号啊,那在这儿呢,我们可以在后边再加上一个目录,诶2020杠零六杠,诶14OK,那到了第二天,也就是6月15号的时候呢,诶,再把数据写到这个路径下边的2020年6月15号这个路径下,好,那这张表的全量同步命令咱们就写完了,然后有一点大家要注意一下啊,就是这条命令呢,我们是不是只需要在同步这张表的第一天执行一次啊,对吧。那后续呢,就不会再使用这个全量同步的命令了啊,那后续每天执行的命令应该是谁呀?哎,应该是新增及变化的同步命令对吧?啊好,那接下来呢,我们继续写一下它新增及变化的同步命令啊OK,我们也是先把这个给它复制一下。
05:15
来CTRV,那我们现在要做的是不是也是改一下这两个参数啊,对吧?那我们还是先改第一个啊,首先我们改表明改成order INF没有问题对吧?完之后呢,把前面选择的字段改成select星对吧?好,那现在我们再来看一下这个过滤条件啊,这回这个过滤条件咱应该怎么写呀?首先我们得明确啊,咱现在写的是新增及变化的同步命令,没错吧?也就是说我们需要通过这个过滤条件呢,将每天新增的数据以及变化的数据过滤出来,没错吧?啊,那咱怎样才能拿到这个新增级变化的数据呢?来,我们去看一下older info这张表的字段啊,来打开na k,然后呢,我们找到older info这张表啊,在哪儿,在这儿来打开,那打开之后呢,我们来看一下这张表当中的两个字段啊,哪两个字段呢,就是它俩。
06:03
啊,一个是create time,一个是oper啊,大家还记得这两个字段的含义吧?啊,Time是不是就是这个订单的创建时间,没错吧?那oper time呢?Opera time是不是就这个订单的修改时间呀?我们前面提到过啊,只要这个订单它发生变化了,那这个opera time是不是就会变成这个订单变化的时间呀?那咱这儿是不是就可以根据创建时间和变化时间去获取每天的新增及变化的数据啊?对吧,这个具体怎么获取很简单,比如说假定啊,咱们今天是2020年的6月15号啊,那我要想获取6月15号的新增数据,怎么获取,那是不是就是cur等于6月15号没错吧,那我要想获取6月15号的变化数据呢?啊,那是不是就是op time等于6月15号?没错吧?啊,那我要想获取6月15号的新增变化数据呢?啊,这很简单,那是不是就是cur time等于6月15号或者opera time等于6月15号啊,OK,那现在大家应该就知道这个过滤条件怎么写了吧?好,那我们一起写一下啊,假定今天就是2020年的6月15号啊,那我们要获取的呢,就是6月15号的新增及变化数据,来,那我们看一下这个过滤条件到底怎么写啊,来,先把它之前的过滤条件删除啊,应该怎么写啊,是不是应该是where create at time等于2020年6月15号啊,哎,但是在这儿呢,咱们直接这么写还不行,为啥啊,因为刚才我们看到了cur time这个字段的数据,它是什么类型的?是date time类型对吧,它有年月日十分秒啊,那咱就直接这样写肯定是不行的,咱需要干啥,是不是需要对这个cur time进行一个格式化的处理啊,对吧?来我们CTRLX啊,然后来一个date for对吧?完之后呢来个号。
07:47
然后呢,把诶cur time放进去,然后再来一个格式化的字符串对吧?啊,应该怎么写呀?是不应该是百分号Y啊,然后杠,然后再来一个百分号M杠百分号D啊对吧?然后还得再来一个oper time对吧?来我们把它复制一下啊,来CTRLC啊,那后边应该怎么写,是不是应该是二啊对吧?来CTRLV之后呢,我们需要把这个create time改成opera time对吧?来op,然后下线time啊好,那这个完了之后呢,还有一个点要注意一下啊,大家注意观察啊,那这一部分是不是我们自己的过滤条件呀,对吧?那这个呢是死库要求我们家上的一个过滤条件,那在这儿呢,我们最好把自己的过滤条件跟它的过滤条件呢做一个区分啊,在这儿呢,我们怎么区分,加一括号是不是就可以来在这儿呢?加一括号后边这个位置呢,咱们也加一个括号啊,然后来一个空格,好,那这个query我们就改完了啊,那接下来呢,我们再来改一下这个target DR啊,在这呢,我们也是先暂时给它改成order ino就行了啊,然后边呢,咱们也加上一个日期,比如在这呢加上二二。
08:47
杠零六杠幺五好,那这个每日新增级变化的同步命令我们也就写完了啊,然后大家可以思考一下啊,那实际上我们每日全量同步,每日增量同步啊,或者是每日新增级变化同步啊,那它在这个死库op的同步命令上是如何体现的呀?其实是不是主要就体现在这个过滤条件上啊,没错吧啊,那在这呢,我可以给大家留个小思考题啊,大家可以思考一下啊,如果我现在要做的是每日增量同步,那大家说这个过滤条件应该怎么写?
09:19
是只需要写一个date一个就可。没错吧,这个其实是比较简单的啊好,那接下来呢,我们再来思考另外一个问题啊,就是咱这个每日新增及变化的同步命令啊,它是不是需要每天都执行。对吧,它不像我们刚才写的这个全量同步的命令啊,它只需要在我们第一天执行一次就完事了,对吧?那我们每天去执行这个新增及变化同步的命令的时候啊,那这些日期是不是应该是不同的呀?没错吧,那也就是说我们每天在执行这个命令之前,还得先去修改一下这个命令的日期啊,那这个是不是就太麻烦了呀,对吧?那咱这儿能不能想一个办法去解决一下这个问题呢?那当然是有办法了啊,当然可以这样去做啊,我可以把这个scoop的命令呢,给它封装到一个shell脚本当中啊,然后呢,在这个shell脚本里边啊,咱声明一个日期变量。
10:12
那之后呢,诶,这个词库命令里边所有的日期啊,都用这个日期变量替换啊,那这个日期变量的值是多少呢?诶这个值呢,它不是一个固定的值,这个日期这呢,我可以写一条商务命令啊,然后呢,让这个命令去计算前一天的日期啊,然后呢,把前一天的日期赋予这个日期变量,那我为什么要去获取前一天的日期呢?诶,很简单啊,因为咱现在是离线数仓对不对,那离线数仓每天去同步去计算的是不是就是前一天的数据啊,没错吧,那所以说在这儿了,我们需要去获取前一天的日期,OK,那有了这个日期变量之后,那我们是不是就不用再手动的去修改这个日期了呀?好,那接下来呢,我们来看一下到底如何获取前一天的日期啊,其实很简单啊,我们使用date命令就可以啊,那大家都知道啊,如果我们直接敲一个date命令,那它返回的是当前的日期,对吧?啊,那我要想返回前一天的日期,应该怎么做呢?来,那我们这儿呢,可以敲一个date杠杠har命令,来查看一下命令的用法啊,来,往上翻,往上翻。
11:13
来走,大家来看一下,那date是不是有一个这样的参数啊,对吧?啊date-D对不对,那这个参数的作用是啥呀?我们看后边啊都是啥是不是display,意思是展示描时而当前时间。没错吧,那现在我们是不是就可以用这个杠D去获取前一天的日期啊,没错吧?来,那我们看一下这个具体怎么获取啊,其实很简单啊,我们需要敲一个date,然后杠D后边呢,需要给它传一个字符串,这个字符串里边写啥呢?啊,就写减1DAY就可以了,那这个减1DAY呢,所描述的就是前一天啊,那如果说我要想获取后一天的日期呢?那就把这个减号去掉,那是前两天呢,那就是减二倍,OK,那就是这样的一个规律啊,那现在我们回车啊。回之后大家注意观察,你看他现在返回的是哪一天的日期,是不是就是8月9号,没错吧,那咱现在的日期是不是8月10号,那所以说呢,我们就已经拿到了前一天的日期,只不过呢,他这个返回的日期格式不是我们想要的,对吧?我们想要的是什么?是不是年杠月杠日啊对吧?那所以说呢,我们还得对这个结果格式化一下啊,怎么格式化是不是后边写一个加号,然后呢,再来一个百分号大F就可以了,对吧?然后回车,好,那现在我是不是就已经得到了我们想要的这个前一天的日期了呀,那接下来呢,我们去改造一下这个每日新增级变化同步的命令啊来,我们打开这个命令啊来,首先我们需要先在前边声明一个日期变量,对吧,在这儿呢,我们就叫做do date啊,而do date等于啥呀?Do date是不是应该等于咱们这条命令的返回结果呀,对吧?来复制一下来拿过来来,大家注意啊,我这能不能直接这样写。
12:46
直接这样写是不行的啊,直接这样写它是会把这个东西当一个字符串赋给do代呀,对吧?那我们要的是啥?是不是这条命令的执行结果,那怎样才能拿到它的执行结果呀,很简单,是不是就加一个票号就可以了,对不对?那票号的作用呢,就是获取这条命令的结果,然后呢,把值再赋予前面的这个变量啊,这是大家一定一定得注意的啊好,那接下来呢,我是不是就可以用这个do date去替换下边所有的日期了,对吧?那现在我们统一的替换一下啊,来CTRLF一下,我们搜一下2020杠零六杠幺五对吧?那现在我们统一的给它替换成Dollar do啊date好,那改完之后的这个命令啊,咱是不是就可以每天重复执行了,对吧?我们就不需要再每天手动去修改它了啊,好,那至此order info这张表,首日全量同步的命令和每日新增级变化同步的命令我们就都写完了,然后其余的表啊,都需要使用相同的方法去编写对应的同步命令啊,然后大家应该能够感觉出来啊。
13:47
际上我们每张表的这个同步命令啊,它的大部分内容都是相同的,对吧?比如说你像这部分内容啊,包括下边这部分内容是不是都是一样的呀,对吧?那唯一不同的就是query和target d这两个参数,那所以在这咱可以怎么做呀?哎,咱可以这样去做啊,我们可以把每张表的同步命令哎,都给它写在同一个shell脚本当中啊,而在这个脚本当中呢,诶,我们可以先封装一个函数,然后把每个表的同步命令当中啊相同的部分给它提取出来,放在这个函数当中,之后我们再同步每张表的时候呢,诶,再去调用这个公用函数,这样一来这些内容我们就不用重复写那么多遍了啊好,那下一节我们再去看一下这个脚本到底是怎么写的啊。
我来说两句