00:00
好,那data叉啊,我们学完了,那学完data叉了,接下来我们就要用data叉来进行我们数据的同步了,哎,这个差呢,它是用来做全量同步的啊,顾名思义就是要把我们这些通过全量同步的表啊,那全量同步的表有哪些呀?我们之前是不是看过呀?啊,一共有这么多,我们把这些表用date差来给它全部的同步过来,那来吧,那我们分析一下吧,这个事儿应该如何来做呀,如何来用这个叉把我们的表全部给它同步过来呢?啊,首先我们看一看啊,那首先我们来看看我们的数据通道呗,是什么样,双击打开我们买circleq当中啊一共有哎这几个表,15张表啊,其实是15张表啊,15张全量表啊,啊其中有一个表叫做IQ in份,那我们要把这个表通过data差给它同步过来,那怎么同步呢?我们同步到HDFS上,应该如何来存储啊。
01:02
哎,依然呢,我们要按天的方式啊来进行存储啊,每天呢,我们给你创建一个文件夹啊,那你看后边我们还给他一个后缀or date进量DB,那active in for for什么意思啊,代表这个是全量表的意思,For是全量表,那接下来呢,我们还会进行增量表的进行同步啊,那增量表这个后缀我们给它一个是INC啊好,来做一个全量和增量的区分,OK。那这段少话你看啊,2020年杠零六杠一次,然后6月15号呢,我再创建一个文件夹,16号呢,我再创建一个文件夹,哎,那就是以表为力度来进行存储,以表力度存储,按天区分,哎,在一是DFS上,那好了啊,第二个表怎么存,第三个表啊也是怎么存啊,一共是15张表啊你看啊,目标路径中我们包含一层负什么意思呢?代表是全量同步,然后呢,再包含一层日期,代表对不同的天进行区分,哎,方便我们在have上进行计算,那接下来呀,我们按天呢,然后给它漏的到离线数仓当中啊,因为have当中是什么呀,按天区分的这个分区表嘛,啊啊这样我们存储方便have使用啊好了,那接下来我们就实现呢,就是这么一个逻辑啊,那这个逻辑我们应该如何实现呢?
02:28
好,我们要先分析一下啊,我们先分析一下,嗯,把这打开。嗯,行,就用它吧,我给他一个圆。啊。那首先我们要看看我们的目的是什么呢?目的。哎。我们的目的啊,是同步15。哥,买circleq的表吧,MYSQL啊,同步15个买circleql表啊,那同步15个买circleql表,那首先我们分析一下这15张买QL表是不是结构都不同啊,结构不同,那结构不同我们得封装成多少个data叉的这个呀,是不是15个你结构不同肯定不能封装成一个,哎,那封装成15个data叉job,换言之就是要执行啊多少次啊15次这个date差的命令啊,要执行15次data叉命令。
03:38
好,然后对的叉命令是py hon啊拍我写出个代码啊,然后对的叉点PY啊点长点PY,然后来一个什么叉叉叉啊点一个再点一个再啊那执行多少次呢?哎,直行15次啊啊三次啊后边这么点用啊一行啊15次OK啊一九十五次。
04:13
好了,那一宿我们执行15次啊,我们想想啊,那关于data差的话,你看我们现在这是不是,哎,Python环境我们有了,那这个对的差点PYG脚本我们也有,那唯一没有的是谁呀。那唯一没有的是不是就这个叉叉叉点摘,那这个东西我们想一想,诶,我们是不是会写啊,啊首先会写啊没问题,那怎么办?那我们一个一个的vim呗,啊15个命令嘛,那我们VIM15次啊,那没有问题啊,15个命令15次嘛,那还是很好解决的,一天搞完了,那好了,那现在啊,我们这个呃,业务数据啊,它增值了,我们这个业务数据库全量表。
05:00
不是我们要同步的全量表不是15个了,是1500个。那你要vim多少次呢?啊,每一个表的结构都不一样,那你要VIM1500次啊,你可能得干一个月这么一,哎,这事你得干一个月呀。啊,那这个肯定是不行,那我们就要想一想了,那能不能一键生成我们这1500个叉叉叉点Jason这可执行的啊,这job脚本呢,Jason脚本呢,摘文件,我能不能用这个自动化的方式来生成它呢?啊那能不能我们先分析一下呗。来到这看一看啊,那分析一下,那那分析你看啊,那这个是什么呢?Hdfs reader啊,你不行,我不用你我们用的是这个啊是这个啊,从文档上粘贴过来这的,这是对叉配置啊。给他粘贴过来。
06:00
CTRLC过来看一看啊,我们看看它能不能给它做成一个模板的形式,哎,我们一键生成呢,折叠所有啊来吧,一个一个打开job count settings啊,这个是配置相关的,那配置相关的行啊,我们就都用一个并行度啊,其他的不用管,那我们看看reader name,哎,这个不用变吧,写死的字符串,那参数呢。参数我们看看啊,用户名密码不用变,Spli PK,哎,我们呢也不指定,就让他用一个task,然后connect连接信息,诶这个是不是也不用变呢?我们所有的表都在一个库下面啊,都是gmail库,那唯一要变的是谁呀?是不是表名要变呢?以及这个列名要变好,那再有呢。我们看看writer,那writer这个地方它不用变啊,它不变,那这个,哎,这个。
07:00
然后嗯,这两个啊,然后再有这个字段的分割符,还有这个。啊,以及这个模式我们是不是都不需要变的,那唯一要变的有谁呢?是不是这个路径还呃这个路径还有文件名,以及这个列名,我们要给它变成一个动态的就完事了啊,通过动态的方式给它生成一下啊,那经过我们的分析啊,好,我们再来一下啊看。在这那经过我们的分析啊,那其实我们是想干嘛呢?啊,第一步,首先我们要一键生成嘛,这15个啊,再那如果说1500个,我们就可以一键生成1500个,再那这1500,那这15个,再或者说1500个,我们能不能一键生成呢。
08:03
啊,那因为都是my circleq reader和HD FS wi RI都是my reader和HDFS。哎,所以说我们可以配置一个Jason模板吗?Jason模板啊,然后来动态的生成。摘文件,哎,我们呢,是可以动态生成这个摘文件,好了,那那这个摘模板我们应该如何写呀?哎,经过我们的分析,动态的地方有几个呀。啊,是不是有两个,一个是reader,一个是reader,那reader这个地方有几个啊,字段名不一样,还有表名不一样,那writer呢,WR writer不一样的地方有几个啊,也是字段吗?字段名啊,那它呢,还包含一个列名,字段名和列名啊,不是字段名和类型,好,那再有这个叫做文件名,OK啊,Writer我们是往HDFS写啊,所以说嗯,它是一个文件名,那还有一个吧,文件的路径,诶,但是这个路径我们是怎么搞的,我们给它搞成了一个动态的了。
09:29
啊,这路径呢,我们给它变成了一个动态的,怎么啊,来个DT吧,好,那这个怎么传呢?哎,我们呢,可以直接通过命令啊,就把这个传过来了,杠P啊,然后来一个杠大地。然后再来一个什么呢?二啊,然后DT吧,啊,DT等于一个。啊,什么什么什么时间吧,啊,等于一个什么什么时间啊啊,那这个呢,其实不用我们传呢啊,不用我们做成一个动态的,我们可以通过命令啊,在执行这个电子差的时候,就把这个时间给它传过来了,好啊,这个我们就不用管了啊,这不用我们管,哎,这是命令管的事,OK,那这个第一步我们分析完了,哎,需要一个一键生成Jason的脚本,好,那我们这一个Jason的模板呢。
10:20
啊,生一首先生一个一键生成15个再生的模板啊,这是模板啊。嗯嗯,首先创建一个一键生成15再生模板,好,那模板我们创建完了,那我们现在这个步骤。啊,生成摘模板,那我们现在这个步骤是能生成几个呀,是不是只能生成一个S森呢。啊,我们呢,可能给这个模板,我给他一个表名。啊,然后呢。
11:01
我我我给他这个当前这个再次模板,它肯定是一个文件呢,啊脚本呢,这脚本我后边传一个表名。哎,然后它给我生成一个对应的摘什么啊摘文件,那你生成一个不行啊,但我们的目的是生成几个呀?啊,我们的目的是不是一要生成15个呀,啊那有同学说,那这个脚本我一个一个执行呗,我执行一次,哎,我给他传一个表啊,生成一个,我再传一个表生成两个,再传一个表生成三个,哎不行,那这啊,我们还需要一个脚本。需要一个脚本,那怎么办呢?哎,给这个筛on模板传传啊,你比方说我给传过来一个库名吧,啊库名,然后表名啊干嘛呢?啊,传过来这个库名和表名之后,我是不是能生成一个呀,那我在这个脚本当中,我封装上15个命令啊,你比方说那这个标本,这个脚本叫做GN_ipt啊import,然后杠一个conig,看这第一个SH,这个脚本的名字叫这个。
12:24
好,那上面这个脚本的名字呢,叫这个。哎。上面这个脚本的名字叫这个啊,这个叫PY啊,这是一个Python脚本啊,我们用Python脚本来做好,那在这个脚本里边我们怎么干呢?好,我在这个脚本里,哎,我调用。十不是15个表吗?那我调用15个这个,我给他传一个gmail,然后对应的哎,我再来一个位下划线PC,那这样我是不是就生成一个再身了,那我是15个呀,那怎么办。
13:05
我在这个地方我要生成15呀,我在这再来一个O啊DR order in份in fo,好,那其实啊,我这个地方也是点点点啊,一共是15个,好了,那现在我们通过这个脚本,哎,我一执行这个脚本,它是不是就能帮我生成15个暂时文件了,好了,那现在你看啊,15个暂次文件有了。这个也有啊,Python呢,我们也有,那么接下来我是不是就可以。执行,嗯三三这叫什么呢?啊,就调用,诶调用这个15次啊date叉,嗯,命令了。
14:00
啊,然后同步我们的这15张全量表啊,最终是不是执行的就是它呀,啊你看。OK。那刚刚啊,我们分析了用data叉来做全量同步的,诶这么一个流程了,那分析完了这个流程之后,那来吧,接下来我们就得一步一步实现了,那为了实现这个目的,我们一共呢,分了三步,第一步首先哎,我们要搞一个生成摘次文件的,生成四五个摘次文件,或者是1500个摘on文件呢,这么一个脚本啊那这个脚本怎么写呢?哎,我们呢,是用Python脚本来写的,那我们看看这个Python脚本应该怎么写啊啊,那由于各位呢,我们也可能没有Python基本功啊,可能让你们写啊,确实为难你们了,那这些脚本呢,也给大家准备好了,我们看看这个应该怎么来做呢。
15:02
我们拿过来看一下啊,那如果说大家有这个Java基本功的话啊,可能让你们写费劲,但是你们,哎呀,你们一定可以看得懂啊,可能写费劲,但是你们一定是可以看得懂的,哎,看得懂还是没问题的啊,我们看一看啊,应该如何来实现CTRLV粘贴啊,给他一个言。还是?Python,嗯,看啊,这是一个Python脚本,嗯,Python脚本这个颜色还行啊啊。那我们看一看啊,这个一键生成一个jaon文件的模板,我们应该如何来写,那作为一个Python脚本,首先诶,你看这是给了一个编码啊UTF8,然后呢,我们要导一些包,诶import导包啊加啊Python呢,它也跟Java一样需要导包,那导导什么包呢?哎,我们既然是要。封装一个摘。那怎么办呢,我们要。
16:00
给他啊,导一个Jason相关的包,哎,那再来一个盖头VBT是什么意思呢?我们这个Jason脚本是不是要给他传参呢?哎,你看这个啊,摘去了这个Python脚本,我们是不是要给它传参呢?哎,啊,传了两个参数,那盖头PT是什么意思呢?哎,这个get o PT啊,它就是用来哎获取我们传参的,OK,那再来这OS是什么意思呢?还有这个SYS,它是跟系统相关的,哎,这么两个参数,OK,然后再有一个my circleql DB啊这是什么意思呢?哎,它呀,我们呃,可能要获取这个my circle相关的一些数据啊,所以说我们要导入一个买circleq相关的包,OK,那下面呢,是我们定义的一些变量啊,啊,这是写死的变量,嗯,My circleq的URL相关的啊,以及hdfs name node相关的啊这还有一个我们生成的这个摘脚本啊,摘文件我们存放到哪一个目录呢?OPT model对叉照本目录下面的port。
17:11
目录啊好。嗯,我们往下看一看啊。那如果说它是一个这个Python脚本,我们应该先看哪个呢?哎,我们呢,先不看这个函数啊,啊Python脚本它也是有一个主函数的,哎,主函数就是我们的main函数啊,在Python当中它不叫方法Python里啊,它叫一个一个的函数,那Python脚本编写的时候,我们一定要注意一个地方,就是它的格式,你发现没,它没有一个我们像这个Java,哎,这种什么大括号啊,哎中括号啊,哎等等等等啊,还有这个什么尾行必须要给一个分号啊,它没有,那它这个格式应该怎么控制呢?那这就需要你自己控制了,你比方说这个DEF是定义方法的,那你定义方法你就必须要顶格。
18:00
啊,你就必须要顶格,那如果说你不顶格,那他会把你当成一个什么呢?它会把你当成你上面这个方法里边,哎,我又给你嵌套的一个方法啊,如果说你没顶格,它会这样,我上面这是不是有一个def JA呢?那它会把下面这个df men当成上面这个方法里的一个嵌套的方法啊好。啊,这样不行,那如果说我这个没有顶格,他会报错,他看哎我跟方法同级了,那它既然是一个方法也没有deff啊,那他会报错啊,OK,好,这是嗯Python啊,Python它的一个格式啊,它所有的都是用table来给它进行一个来换行啊,Table换行啊,这个如果说你不换行这个地方你要是不换行,它依然会报错啊OK,好,那来吧,我们从函数看一看,那们函数这我们首先定义了两个变量,一个是source database,一个是s table,也就是我们的。
19:01
数据库名没和表名呗,那它有什么用呢?哎,然后我们在这用get op PT这个包下面的get op PT方法,哎,获取什么呢?获取两个参数,一个是杠D这个参数名啊,一个是杠T这个参数,这个参数名它们两个所对应的参数值啊,那其实就是我们在这个脚本当中啊,其实参数是这么传的啊啊,我们在这先传一个杠D叫做database,然后呢,我们再来一个杠T啊,这是table啊,这也是杠d database。啊,这边呢,杠T1TABLEVO好,我们呢,它会把杠D后边的这个参数和杠T后边这个参数帮我们获取出来,那获取出来它怎么办呢?哎,通过for循环的方式,把这两个参数啊,分别来给我们进行一个赋值啊,如果说你是杠D的话,我给你赋制到这个source database上,那如果说你是杠T呢,我给你复到哎这个source table上啊,OK啊,通过这个循环的方式,我给你进行一个赋值,那赋值完了之后啊,它又调用了这么一个方法啊,Generate。
20:18
好,那这个是什么意思呢?我们看一看啊,这个方法在这个generate啊,不是叫方法啊,这个函数。这个函数我们传过两个参数,一个是source database,一个是source table,啊它它你看我们现在是不是传过来一个库名了,一个表名了,那假设啊,这是gma,那这个是呢,Base pro省份表,好,那我们主要来看一看generate这个函数,它里边定义的什么内容,哎,在这呢,那它这里,诶这个我们是不是比较熟悉啊,首先是一个job个变量,那这个变量后边跟了一个字符串,这个字符串是不是就是我们data叉的Jason啊,这一个Jason文件S文件里的内容啊好OK,我们看看啊,它是怎么干的。
21:05
三定词配置相关content,哎,这是我们要关注的,那首先reader name my circle reader啊,Username password,诶这两个是不是上面给我们定义好了啊,在上面啊,这都定义好了,写死的啊,写死的那再往下。舍不的PK,哎,这个不用管啊,然后collect啊,这是连接信息,那table table搁哪呢?Table是不是我们这传过来的呀,函数就传过来了,那database和table啊就传过来了啊,Table就直接放这就完事了,然后JDBC的URL我们是不是在上边你也给封装好了呀?啊那最终呢,我们要查询一个数据库当中的内容啊,那我们在这,哎把source贝贝给拿过来,那source data我们是不是也是函数带过来的好。啊,这些都封装好了,那现在还剩哪个地方啊?啊,表有了是不是就剩一个column了?那之前我们也分析了,Reader有几个地方不一样啊,表名和字段名,那表名我们现在是不是已经有了啊?表名我们在这已经有了,就差一个字段,那字段如何碰撞啊?我们在这儿又调用了一个函数,叫做get my circle columns啊,然后在这里穿过来两个参数,一个叫做source database,一个叫做source table啊,来吧,我们看一看如何能通过库名和表名我就能获取我当前这一个表所有的字段呢?
22:35
躺着啊。Get my circle columns啊,这个函数它是怎么做呢?啊,在这里它return了一个map啊,在map里边呢,诶,它并没有直接return啊,而是又调用了一个函数叫做get my circle m,那我们看看这个get my circle m啊就在上面,我们看它是怎么做的啊,啊,他获取了一个链接信息,哎,这个是买circle的链接信息,我们上面是不是导包了,买circle DB啊导包了,那导包之后。
23:09
我们在这是不是就可以get上my circle的connect啊,这里边my circle DB点一个connect,然后获取my circle的链接信息,然后我再调用过来,好,那接下来我通过这个connection呢,第二一个,哎,这个这是什么意思呢?Circleq的一个执行器啊,然后我封装一个circleq语句,然我们主要来关注一下这个社会语句,看看它select一个column name data type,诶查询的东西是不是刚好我们想要的呀,列名吗?我们在这是不是叫封装一个列名啊,啊封装一个字段名,哎,这刚好是我们想要的呀,Column name data type属于类型,那从哪查询呢?从我们啊这个表当中,哎,这表这表我们没看过啊,这是information sIgMa数据库下面有一个column。姆斯。
24:01
这个表啊,那么条件。Tablechema啊,这个通过表啊,这个tablechema这个字段和table name哎这么两个字段,那这有一个两个占位符,那第一个占位符是什么呢?哎,就是我们传过来的第一个参数database,第二个呢是table啊,那这个table盖ma,它是一个库名,然后这是一个。Table name表明啊,用这两个参数来控制的好啊,那这个表我就知道了。我在informationchema这个库下面有这么一个表,叫做columns,然后呢,我通过限制库名和表名啊,最终我就可以把这个表所对应的列名和列的类型查出来了啊,那我来到这看一看啊。啊,给它关掉,那这个information sIgMa是MYSQL自带的这么一个数据库啊,自带的,那这里有一个表叫做column斯啊,点出来看一看吧,看看这里都有什么内容呢?哎,这边没看过,那来吧,我们看一下,看这个table tablechema,这里边存储的是什么呢?这个列啊,这些都不认识,那往下翻,往下翻,诶,这个我们是不是认识啊,Gmail啊,这是我们的数据库,那我们传的时候是不是就传了一个gmail啊,那然后右边呢,Table name啊,你看active in for活动表,那我们找一个认识的表啊,再找一个啊,你看往下翻,哎,Base province。
25:27
我们是不是就这表啊,好,那这表我们往后看一看啊,我们是通过这个gmail数据库以及base pro。哎,我们限制住了六条数据吧,外边条件嘛,限制住了六条数据,那这六条数据你看这这是不是有一个column name啊,到这是一个column name吧,这。好啊,Column name我们查出来了,那再往下走,你看这儿还有一个什么呀?除了column name之外,还有一个列叫做data type data type,那这六列是不是还对应了一个?
26:04
这叫什么数据类型嘛,那我当前这个列它所对应的类型,哎六个你看,那么我们是不是就可以通过一个库名和表名,就把列名和字段类型给你查出来了啊,那我知道了这个SQL语句它最终,哎你看通过XQ1执行,它会返回两列数据,哎这个你看啊,SH就是返回它这个返回值,返回值呢,给它复制到一个翻SH这个变量上,那这个变量它现在是两列,第一列是我们的。字段名第二列类型。啊,类型。好,这个类型啊,它现在是返回两列,OK,那然后呢,我这关闭资源,关闭资源之后,我把这个发烧,也就是这两个列我给你返回呗,那返回到哪呢?谁调用它返回到哪呗,那谁调用它呀,它调用的吧,啊那在这个地方我们现在是什么情况啊,现在是两个列吧。
27:08
第一个列是我们的name字段名啊啊,第二个列呢,是我们的type呀,字段类型啊,好,那来吧,我们看看,那对于我们这个买circle的column来说啊,我们买circle reader type类型我们不需要吧,我们仅仅需要一个字段名。那怎么办?那你这个地方把两列都返回了这一列有没有用啊,啊,那我们在这通过这个拉姆的表达式啊,来一个X啊,X是谁呢?就是。它的一个返回值的一个整体啊,那是不是他们两个呀,两列,那两列对于我们来说一列有用,我们要谁呀,我们就要一个X0就完事了啊,那X0这就是第一列的意思啊,啊,这个是X。零,那这一列是X1,如果说两列我们都需要保留,那么X1我也给它保留,但是我不需要,我现在仅仅需要获取一个X0,那么第一列它就要获取出来了啊OK,那获取出来之后,我通过return把把所有的列名都给你返回过去,那返回到哪啊,谁调用它返回到哪呗?那谁调用它呀,你看是不刚好列名封装这个地方调用它呀,那返回到他这去了,那返回到它这去,到这儿reader我们是不是就封装完了?
28:35
OK,那reader封装完了,接下来我们再往下看呢,我们这儿还有一个writer,那writer是怎么封装呢?那name不变啊,DFS这个也不变啊,这是固定的这个啊,也不用管pass我们是不是在命令当中传递的呀,哎,Pass是在这传的啊,这pass。好,那然后file,那文件名啊,那这个文件名跟我们表名是一样的呀,在哪传呢?啊,在这个函数当中的参数啊,就传过来了,那传过来之后那还有谁呢?你看啊,这个写入模式啊,不用管,我们有个判的模式啊,然后呢,Fileter。
29:16
我们用的是反斜杠T,那这都是固定写死的,好,那变化的就他俩呗,而且这个我们还解决了,那就剩下一个column了,那column怎么办呢?哎,我们用一个get have columns啊,获取一下have的列啊,那来呗,我们看看这个函数怎么写的。啊,在这get have靠拢词,但是在这里,哎,你看我们这是不是就有一个嵌套的函数了,在这个里边我们又定义了一个函数,啊,在这个函数下面我们又定义了一个函数,那我们先不看它啊,我们先看谁,我们先看看这个get have column斯是怎么写的,往下翻。这个get have column莫斯啊,它首先调用了一个get my circlel m,诶,这个函数大家还记得吧?Get买SLM搁这呢?啊,通过这个S语句进行一个查询,然后返回两列,那么我们现在这个M。
30:12
是一个什么结果啊,是不是两列呀啊往上一点啊,往上一点好,那这个M它现在是什么,是不是两列的数据。第一列是name,第二列呢是type,好,那对于我们这个have的column来说,Have的这个HDFS的write来说,它既需要名字又需要类型啊,所以说获取完这个M之后,你看把M放到这了。哎,这面就放到这儿了,那么。他最终return是不是要把这俩列都回去啊,那怎么那怎么呢。X0放到第一列,然后呢,我们给一个内。那第二列是什么呀?是tap吧,第一列的名字就是name,第二列的这个类型啊,名字叫做tap,那tap是谁呀?是不是X1呀?但是这个X1我们又给它调用了一个方法,通过type mapping啊把X一传进去了,并且用一个lower来给它来一个小写。
31:17
那这是什么意思呢?我为什么不能直接传类型呢?我们看看啊,啊,这type mapping可是定义的啊,我把my circle的每一个字段的数据类型拿回来了啊,然后我给你做了一个映射,你买circleql当中是big big in,我让你用big in,那买circlel是in,你还是big in啊,那你买circle是这个decimal,我让你是死句,你买circle是float啊,你是float,那你是这个date time。你是死罪,你是马叉,你是死罪啥意思啊?就是把我们my circle的这些数据类型给它映射到have当中的数据类型,为什么要这么干?因为my circle和have的数据类型它不一致啊,我们要给它做一个对应的映射,OK,做完映射之后,那我们呢,X0返回内X1,哎,第二个参数type类型啊,这个它返回的是我们的type OK,那封装完之后我们呢,给它回去,那谁调用它,那就return到哪呗,那谁调用的它呢?
32:22
我们看一看谁调这个get还有column了,是不是下边这个Jason脚本啊,啊这Jason啊这呢,那么现在我们整个的这个Jason的job的配置是不是就配置完了,那配置完了它现在仅仅是一个字符串啊,还不行,我们要把这个字符串给它写入到一个文件当中,那怎么写呀?啊,那写之前我这进行了一个判断,通过if判断if not判断我们这个路径存不存在啊,如果说不存在not exist就不存在嘛,那不存在怎么办呢?我们make DR创建一个路径,那如果说存在了呢,我们就写呗,哎,往这个路径下面写啊,那写的时候怎么写的,你看用OS我们是不是导了这么一个包啊。
33:10
那OS啊OS。哪啊上面啊这OS,那来吧,我们看看它怎么写的啊,OS点一个pass,诶这个路径啊,点一个Jason,那这个Jason我们要写一个Jason呢,哎,最重要jason.damp是往出写啊,那这个JA我们这个Jason的名字应该是什么呢?哎,Jason写的路径是什么呢?哎是这个是output pass,这个是我们最终写的一个路径啊Jason我们要写的一个路径,那路径知道了,那文件名呢?啊,这也是文件名,那这个文件名它是怎么干的啊,你看用点拼接。用点拼接,那用点拼接它是怎么拼接的呢?把source database这个是我们的数据库名,然后用点一个表名,然后再点一个摘啊最终是这样的库名,点一个表名,然后再来一个点摘,那这个是不是就是一个摘文件了,OK,然后最终呢,我们就可以往出right哎,往出写了啊你看那接下来你看啊,它就再森点弹法,就是往出写的意思。
34:24
OK,那么这个呀,就是我们啊,生成一个Jason的这么一个文件,好,我给他拿到我们的项目当中,Ctrl a ctrl c啊放到。这好像是啊,102,我CD到102的并目录,那进来之后,我vim一个GN_ipt import_一个config conve点一个PY啊点PY那然后。我把这个粘贴进来,粘贴进来啊,然后冒号WQ保存啊这么的吧,我们体验一下嘛,诶体验一下这个我们就不需要给他权限了啊,这个是不需要给他权限的,我们也能执行,通过Python来执行Python,然后G啊它那它需要一个杠D啊,那database gmail再来一个杠T。
35:22
Table表明base。下划线,P v CE in CE OK,那接下来我一直行。啊,未找到命令Python啊,P y p hon Python,他你看啊,他说在行什么呢?他在执行这个my circleq DB的时候啊,他说没有这个模块叫做my circleq DB的模块,为什么呢?哎,因为我们还没有导入my circle。对,这个Python的驱动包啊,My Python使用my circle的这个驱动包,我们还没有导入,哎,所以说我们要先导入这么一个驱动包啊,往下翻在哪呢?哎,在这呢,执行一个这个命令,安装一个my circle-Python的驱动包,右键粘贴。
36:15
好,那给它安装完,安装完之后,你看我们就能执行了啊,通过这个命令啊,来一个杠D啊database,杠t table,那这个地方你要自己进行替换啊,这是库名,Table是表明,哎,你不要用这个,你这两个这是啥呀,那这两个是不存在的啊,你生成完了这个你也用不了。OK。好,那完事了,我们再来执行一下回车,你看它现在就能执行成功了,那执行成功之后,我们进来看一看CD杠。OPT model data叉啊,这些叉那生成到哪了呢?生成到job本目录下面有一个importt目录啊,搁这呢,CD到iportt import进来,你看g.base promise库明点表明点点一个,再那我们接下来看一看。
37:08
Vim vim一个gmail点它你看那这个呢,它就给我们生成完了。保存保存完之后啊,我们这么的啊,那。CD点点杠点点,那么接下来我们就执行一下这标本,看它能不能直找到B目录下面的这差点PY,然后再找到这个立目录下面的谁呀。啊,立目录下面的啊,不是立job目录,Job目录下面的import import,然后呢,下面有一个gma点点,那我现在一它肯定执行不了啊,因为没有这个路径啊,没有这个路径,那我们指定一个路径,那这个路径我们指定一个杠P啊,再来一个双引号啊杠大D,然后再来一个。
38:03
谁呢?啊,再来一个target,这个名字叫做target啊,Target DR啊target target等于一个啊,这个BA base_pro。Vic就base province吧啊,那我们看看啊呃,Base province这下面现在应该是有一个有一个啊,那接下来我们再执行一下看看。看看能不能执行成功啊,你看他已经执行成功了,34条数据啊,这回为什么是34啊,因为我们没有做外条件的限制嘛,直接就配置了一个表,我们没有配置外啊,OK,那来到HDFS上我们看一下呢,HDFS上刷新啊,数据已经写入进来了啊OK,那这个生成摘文件的这个模板文件呢,我们已经写完了,通过这个Python脚本我们可以生成一个摘模板,哎,传过来一个库名,一个表名,我们就生成了啊,那接下来我们需要15个载什么键啊,那我怎么办?哎,我执行15次呗,啊,那执行四五次可以,那我如果说有1500个表呢,我这个命令我还要执行1500次吧。
39:18
那执行1500次还是比较多,哎,我呀也要通过一个脚本来做这个事儿,那这个脚本就比较简单了啊,这个脚本你们就擅长了,我们呢,写一个啥呀,我们写一个这个。Cell脚本,那我们看怎么写呢,脚本啊,这来到文档啊,这个呢我就不写了,非常简单,你看井号叹号B-CE脚本。这脚本非常简单啊,没有什么技术含量,CTRLC拿过来CTRLV粘贴啊,井号叹号B-ma,然后调用15次啊,传过来15个库名以及表名,那么我一执行这个cel脚本,它就帮我调用15次,我们的data差点PY啊,不是调用15次生成这个摘文件的,这Python脚本,那么我15个摘文件就生成了,OK,那这个脚本我们拿到项目当中啊,CTRLC啊CTRLC,然后来到这vim一个G_inport_con啊点一杠,这个是SH,哎,刚刚是点PY,现在是点SH,来到这儿右键粘贴啊,右键粘贴完事,冒号WQ保存,那保存完了,它是一个cel脚本呢,那这个我得给他一个权限了啊。
40:42
Z mod777,然后GN点一个S啊S完事之后,那接下来我们试试呗,啊直接下划线好,那我一直行。啊,那完事了,完事了,我CD到OPT model这个叉。
41:03
CD到哎这的叉,然后照本目录下面有一个import I putt进来,进来之后我们LL一下,你看那对应的这15个啊配置文件的这脚本,哎,它就给我们生成了啊好OK,那这个地方我暂停一下,好那全量表的同步,我们还差最后一个步骤,哎,就是需要一个脚本啊,调用15次data差的命令啊,同步15张全量表啊那有同学说了,那我调用15个这个叉的命令,那跟这个一样了,那就那就这么的吧。啊,我搞一个这这个脚本啊,啊,搞一个这么个脚本,嗯,那怎么干呢,你不是Python吗?Python Python,然后我把这个给它拿过来。难道这个没了15个吗?CTRLC诶分到这,那我把这15个命令放到这不就完事了吗?对吧,你让他执行呗,一共执行15个,那这样行不行呢?啊这样啊,其实看起来是不是行啊,但是我们要分析一点呢,你说我们执行的时候,我今天啊,我这个参数是20206月14号啊,那我今天是这个,那我在执行的时候,我有这个目录嘛,目录。
42:25
是不是没有啊。那没有没有的话,他能执行成功吗?啊,不能成功啊,那没事,那比如说我创建一个呗,行啊,那你去创建好,2020年6月14号的,你创建完了,我们是每一个表,哎,它都有一个这个目录,那对应的你要每一个表都创建一个,那好15个表你创建15次,然后1500个表,你每天创建1500次。那如果说这是一天呢,那6月15号了呢,你还要创建1500次,那6月16号了,每天你都要创建1500次啊,疯了,每天啥都不用干,光创建这个啊,那这肯定是不行了啊,那怎么办呢?哎,这啊,我们不单单就是执行15个这个data叉的命令了,在这儿呢,我们还要来做一些事儿啊,那来吧,我们看看这个脚本应该怎么写,那来到文档当中,我们呢,把这个脚本给它复制过来。
43:20
哎,看看这个逻辑应该怎么实现,那这个S脚本一共是100多行啊,还是非常长的CTRLC,诶拿过来拿到。这个地方CTRLV粘贴好,然后给他一个言。Ex cell。来,那我们看一看吧,那三脚本井号叹号并哎,这是一个S脚本,然后我们在这定义了一个date叉的home啊date叉的权利名啊,OK,那接下来我们看看if判断,那它是怎么做呢?啊,在这个if判断当中啊,它封装了一个变量叫做do date啊那有两种方式,那怎么来进行给它赋值呢?哎,如果呀,杠N一个谁呀,DOLLAR2啊第二个参数,那杠N是什么意思呢?哎,判断我们这个第二个参数的长度。
44:14
啊长度,那如果说我们这个第二个参数,它的长度杠N啊,如果说它这个大于零的话,那么它会返回一个处啊处,那大于零返回一个处,那怎么办呢。哎,它就把第二个参数赋值到do date变量上,那否则是不是就小于零了啊,小于零,那小于零的话,这个do date呀,它也没让你空着,哎,给我们赋值了这么一个参数,那这个是什么意思呢?哎,Date这个函数我们都知道吧啊啊,Date这个命令啊,我们执行一下啊,你看S命令当中date date dat啊,你看date是啥意思啊,它打印一个时间呢,但是这个时间啊,这是这么样一个时间,那我们就知道了,这个do date它应该是跟时间相关的,那我们这个上面这个Dollar二传过来的应该是啥呀?是不是应该就是一个时间呢?啊第二个参数我们传过来的是时间,那我们看看啊,那后边这个是怎么做呢?那它最终输出一个什么结果,右键粘贴我们看一看do,对当D,哎,减一有点像什么意思啊,是不是我们当前的这个时间减一呀,你看。
45:31
我今天是五五月十,五月二十二十号,但是我来一个减一变成了5月19号,好杠F啊,就是格式化的意思啊,那原来我们这个第二个参数传的是这么一个格式的时间,2022杠零五杠一九啊年月日中间用这个横杠分割的,那为什么要传过这么一个参数啊,哎,这个就要跟这来进行互应上了,你看我们的数据通道,我们在数据通道这这个时间是不是就这么封装的呀?啊所以说我们传的时候就要传这么样的一个时间啊,OK啊,那它是来判断我们这有没有第二参数的,那如果说我这个第二个参数刚啊判断它的长度,长度大于零的话,那返回一个处嘛,那返回处了,哎,他把我们的第二个参数给它放这,那如果说我们这个第二个参数长度小于零,那怎么办?哎,我们给他传一个这个,说白了就是判断这个第二个参数存不存在啊好了,那完事之后。
46:31
报这有一个handle t drr函数,我们先不看它,哎这个呢,先不看它,先怎么看呢?先从入口开始看啊case啊,Case选择器,那这个case选择器它判断的是DOLLAR1了,哎,现在它判断是第一个参数,上边呢帮我们判断第二参数,哎,下边呢,帮我们判断第一个参数,那第一个参数如果哎,我们啊,第一个参数K选择器啊,它这是什么呢?你看第一个参数传的都是什么呀?诶,Active e active入啊你再往下看,呃,Base provice啊,第一个参数它传的是一个表名啊,哎,合理啊,因为我们要这个脚本,它同步的就是一个一个的表嘛,对吧?啊,没问题啊,那它同步的是表,我们看一看它怎么做的呢?假设就拿active in这边来举例啊,这里它来了一个import date啊,那这个import date搁这呢,这是一个函数啊,它调用了一个import date函数。
47:31
那我们来吧,看看这个port data参数,它传了两个参数,诶,第一个参数,这个我们熟悉啊,刚刚生成完嘛,这不就是data叉所需要的摘次文件吗?Data差的配置,第二个origin date gma DB啊,这个是我们业务数据的全量业务数据,而且还是你看这是一个否啊,全量业务数据的一个HDFS上的路径啊,那这个函数我们传过来两个参数,一个是。
48:02
这个data差的配置,另外一个是HDFS上的路径啊,而且把do date也给拼接上了,也do date是我们刚刚封装完的啊,那把它拼上了,拼上了之后我们看看这个data这。哎,第一个事呢,Do date它把DOLLAR1哎复制上了,那这个DR它把第二个参数啊给获取到了,这个是我们import date这函数啊,传过来的第一个参数,第二个参数了,注意这个可不是这个,呃,脚本的第一个参数和第二个参数了啊呃,接下来handle它给的电影啊,在这里边它经过了,又经过了一个handle target的DRR对目标的目录啊进行了一个处理,嗯,看看啊在哪呢,在这呢,行,那我们先不看,我们看那处理完了之后他干了个啥事啊,哎,通过Python是不是直接就执行了,你看这个差点PY把这个它给的DRR放到这啊,那就是把它呗放到这啊,然后。Date差,看这是不是就date差的配置啊,哎,那这样它就可以执行了,那主要我们就来看看handle,它给DR它是如何执行的呗,啊来看一看在哪呢?啊在这handle target DR这是什么意思呢?处理目标路径啊,此处的逻辑是如果目标路径不存在,我们呢就创建,如果存在我们呢就给它清空,哎目标目的是为了干嘛呀?哎,保证我们的任务可重复执行,那为什么是重复执行呢?这个地方我们还要哎说到说到了它如何能保证重复执行好,那说到这儿我们就要配合这么样的一个参数来使用了。
49:42
啊,看这个参数啊,我们的这个写入模式啊,啊有一个pen写入模式在哪呢。嗯,Parater,这是write mood,哎,Write这是什么呢?你看writer啊,Writer了,嗯,它是HD FS writer,那我们HDFS的这个writer write mode写入模式有几个,有两个吧,一个是a pen,一个是弄complete,啊,那什么叫做保证任务可重复执行呢?哎,是这样,你看啊,我们把这个数据写入到HDFS,那写入到HDFS的这个目录假设啊,我就写入到贝斯province,哎,我第一次写进来写入它。
50:23
那如果说我们有个判的话,找判啊,我再执行一次,是不是我在这个目录它又写入了一个文件呢?那他俩重复了呀,哎,我一天写入两个文件,是不是重复了,那肯定不行啊,我想我写第二个的时候,我能不能把第一个给删掉呢?理想的情况是这样,但是这个叉它不支持这个功能,它不支持帮我们清空这个目标路径的功能,那怎么做呢?哎,我们需要用脚本,我在执行之前,我先判断一下你这个路径存不存在,那如果说存在了的话,我是不是就可以直接。
51:03
往里写了呀,但是存在的话,我还得判断一下你是不是空目录,你存在了,有可能这里之前已经有有文件了啊,那有文件了怎么办,我得给你删掉。好,那如果说不存在呢,那就好办了,我给你创建出来直接写就完事了啊,那现在就分两种情况了,我这个。目录啊,也就是我要往HDFS上写这个目录,它是否为空,那好了,那现在还有一个问题,诶,那同学说我这个除了我pen的之外,我还有一个模式啊叫no con,那我用no con不行吗。哎,那么康威AK呢,它确实可以帮我们判断我们这个目录是不是为空啊,那如果说它不是一个空目录的话,哎,也就是说这里有东西他呢也不会帮我们清空,而是直接报错了,他不会往里写啊,那他既然报错了任务就停了呀,那也不行,哎,我呢还不想让这个任务停,那好了,那现在我这么一个问题,那你说我们到底用个pen呢,还是用用completeate呢?哎,其实现在啊,用哪个都行了,为什么呢?因为我们可以用这个函数帮我们处理一下这个目标的路径,也就是说我们在执行的时候,通过handle他们的DR之后,这个目录啊,它一定是一个空目录了啊,因为我们已经给它清空了呀,你看如果说存在,那我就给它清空掉好了,那用它俩都行,我们得选一个呀,你说用谁呢?用谁更好啊,是用aend的呢,还是用那communicate呢?
52:33
啊,还是用这个no康f Li想想啊,用谁要好一些呢?啊,那我们分析一下,那这个no convidicate,它既然能判断我这个目录是不是一个空目录,然后进行报错,那他在写之前是不是一定会有一个if术判断呢?判断你是不是一个空啊,判断这个目录里是不是空目录有没有东西啊,他一定经历一个判断,那他直接往里写的原因是因为他没有判断。
53:07
那大家想一想,你说我们用哪个好一些,是不是用个pen的要好一些呀,虽然说他俩都行,用个pen的要好一些吧,为啥呀,我们少了一次判断了,哎,它不需要判断了,对吧?反正你已经是空了,你判不判断还有什么意义吗?没有意义了啊,用个end的要更好一些,好拿来吧,接下来我们就看看我们这个handle target给的DR应该如何来做啊,那目的是为了干嘛呢?目的就是判断我当前这个目录它是不是空呗,啊,那这儿有这么一个命令,我们看一看啊。哈杜FS-test,杠E,诶,然后后边来个DOLLAR1,那DOLLAR1是什么呢?我们看一看吧,Handle target DR啊,传过来一个目录啊,那通过哈杜FS-test的杠一来判断我们这个目啊,那这个是怎么回事呢?我们看一看呗,啊执行一下啊,CTRLC拿回来来就是我们看它最终返回一个什么东西呢?杠一啊,它需要一个目录是吧?那我们给他一个目录,我来一个base_pro VC啊那我执行一下呗,这个目录现在是存在的吧?哎,你看存在,哎,那不对呀,他啥也没返回啊,那它啥也没有啊,哎,原因是什么呢?原因呢,这个命令它呀,会把它的结果啊,Re return出去,Ret rn,那return出去的结果我们如何来接收呢?我们要通过Dollar问号来接收啊,Dollar问号来接收,那我直接Dollar问号能行吗?哎。
54:43
不行啊,我要echo出来IO一个,到了问号,它这里有东西啊,我再重来一次,你看啊,我执行一个这个命令,执行完这个命令之后呢,我在执行一个IO Dollar问号,它反馈一个零,哎,它什么都没有,但是我这个base province下边,嗯,它是有东西的。
55:04
反而他返回了一个零,哎,上面那个127不是返回了他的啊,上面那个127不是返回了他的啊贝promise。OK,那接下来我们再找一个不存在的目录试一试啊,这个目录肯定不存在,那它不存在,然后我再执行一个Dollar号啊,返回一了啊,那现在我们就知道了,如果说通过这个命令之后,目录不存在,返回一个一,目录存在啊,它反而返回的是一个零啊,那它是判断我们这个目录存不存在的呀,好,那来吧,我们看一看通过它之后,然后我到问号获取的是谁呀,获取上一个命令的返回结果,那我上一个命令的返回结果啊,然后杠EQ是I啊,等于你是否等于一呢?那等于一代表什么了。还记得吗?看看,等于一代表我们当前这个目录不存在吧,那等于一的话,代表当前这个目录不存在,然后我们make DR,然后杠P叫做这个便利创建啊,哎,创建多级目录,OK,把我们这个目录给创建出来,那你目录不存在我就创建出来呗,那如果说目录已经存在呢?那怎么办?哎,我得判断一下你这里是否是一个空目录啊,我要保证你这个目录是一个空目录。
56:29
好啊,那怎么办呢?那我如何能保证你这个目录是一个空啊,哎,我得想办法又进行一个判断呢?哎,这还有一个命令呀,哈多FS-count,哎,然后又来了一个DOLLAR1啊,那这个命令又判断了一下DO1啊,这个目录我们看一看啊,来看这个命令,它最终返回一个什么结果依然是base_province回事。啊,它这里返回了三个值啊啊一个两个三个,哎,那这三个分别都代表什么呢?我们来到这个目录看一眼,嗯,这样我呢,先把这个删掉删掉,删掉之后我再执行一次回事,哎,依然是这三个知道,哎,你看它没变啊,它变了,然后F1给他截个图。
57:24
哎,截图我们做对比好看啊,上面呢是我第一次执行的时候,下面呢是我第二次执行的时候,那我在第二次执行的时候,我删了一个什么,我删了一个文件吧。然后他少一个,那证明第二个参数是什么呢?哎,是我文件的数量,文件的数量第二个参数。啊,那文件数量那诶那这边的呢,你看诶我删了个文件之后,这个也少了,那这个我们看它少了多少啊,嗯,1624减一个1064,它减它零,嗯四。
58:06
呃,减648啊,580,哎,是不是580啊。啊580啊,少了500多,那他少了500多,少的是什么呢?哎,其实啊,少的就是它的这个字节的,哎,这个数啊OK,那它其实少的就是这么一个字节数,好那前面这个呢。那前面那个应该是什么呢,想想。啊,前面这个是文件夹的数量,是当前那个目录文件夹的数量啊,第一个是文件夹的数量,第二个第二个是文件的数量,第三个是什么呢?第三个哎,是我文件的总字结数,注意啊是总子结数,那有同学说也不对啊,那你要是文件的数量的话啊,文件夹的数量,我这里有几个文件夹是不是只有一个呀?
59:06
是不是只有一个,对啊,确实只有一个文件夹,但是它为什么是二呢?因为他把它自己也带上了,所以说这是两个啊,那你要说文件夹我加上他自己行,那文件呢,哎,文件我现在为什么是两个呀,我依然只有一个呀,哎,注意他这个判断呢,是进行一个啊迭代的判断啊,啊循环的判断,它会把文件夹当中的这个文件也给我们遍利出来,那它俩加一起是不是刚好多少啊五个大。哎,它刚好是啊,不是它刚好是两个啊两个那文件的这个字节数我们看一看看这一个是532,那两个呢,乘以一个二啊,我下边这个也是532吧啊532,那532乘以二是不是刚好1064啊啊刚好两个文件的字节数,OK,那么这个就是我这个命令的一个返回值,那如果说我想通过这个命令来判断我当前base province这个目录,它是一个严格的空目录,那怎么办呢?它这三个参数返回谁比较合适啊?
60:16
返回谁?它是一个严格的空目录,那我们测试一下不就知道吗?那各位呢,也可以拆一下啊,我先给它删掉我呀,再把它也删掉,它现在是一个空目录了,那空目录我接下来再执行,应该返回谁呀?啊,首先这个参数肯定是零了吧,文件的数量肯定是零了。那文件的字节数它也肯定是零了,没有文件字节数肯定是零,那文件的数量呢,哎,是一个啊,它要包含他自己,那它最终返回的应该是一个100,我们看一看李事。啊,现在啥都没有了,它这三个参数返回的是100了,OK,好,那通过这三个参数我们就可以判定它是一个严格的口文件了,那好,那接下来。
61:05
我们把这个命令的返回值,哎,赋值到了一个变量上,叫做FS-count啊,那对于这个SS杠杠,你看啊,我们获取到了,那获取到了之后我们干嘛呢?通过aw k给它进行了一个切分啊。获取到了fe,截个图。你看啊,我们把这个反馈值啊,通过Dollar获取到了,获取到了之后,我们通过aw k进行了一个拆分,那拆分了之后我们获取到第几个参数呢?我们获取到了第三个参数,哎,DOLLAR3AW k嘛,默认是用谁切分呢?默认是用空格,那它两边哎就是空格啊,就是空格切完之后你看啊,这个也是一个空格,好,那切完之后我们要的是谁呀?我们要第几个参数呢?哎,我们要第三个参数啊,为什么要它呢?其实严格上来说呢,我们这第一个,第二个,第三个都需要获取,获取完之后我们在这进行一个判断,If。
62:10
这个第一个参数。杠EQ1,然后按第二个参数杠EQ0,第三个参数杠EQ一个零,哎,通过这三个参数,但是呢,在这个地方啊,我们呢,偷了一个懒,我们直接就用第三个参数来判断了啊,就判断它的这个文件的尺寸呢,等于零就完事了,为什么说这样也可以呢?因为我们在这个目录当中,它不可能有文件夹了。首先这个它肯定是为一,它永远不可能为二,因为我们就没有往这个目录创建文件夹的这个步骤,哎,所以说它一定是唯一,那我们在这呢,就偷一个懒,那严格一点啊,要用他们三个哎来进行控制好了,那如果说它等于零了,代表什么呢?代表我这儿现在就是一个空目录,那我什么都不需要处理。
63:02
那如果说这个不等于零怎么办呢?哎,我们在这儿啊,就要给它清空了,你目录不为空,我就要给你清空,通过哈SFS杠,RM杠,RF,然后把这个目录下面所有的内容给你删掉,OK,那这就是我们对目标路径的一个处理,那处理完之后我们是不是就可以哎,通过这个命令往里写了啊,那这样啊,它就可以变成一个可以重复执行的这么一个脚本,哎,自动化的脚本非常方便,就不需要我们人为的来处理了。好了,那到这儿我们现在是不是仅仅同步了一个表啊,那同学说你这个也不智能啊,你同步就能同步一个表,我每次都穿一个表名,哎,不要急往下看啊,这些都是一个表名。啊往下看,哎,你看这有这么一个参数啊哦,那这个奥里边它传了一个什么呢。Import data传了15个import data,然后对应的我们把15个表的这个摘15个表的路径全都给你传过来,那传过来之后,我就可以通过这一个命令来做一个自动化的数据同步了啊,自动化的数据同步了,OK,那么这个就是我们数据自动化同步的一个脚本,接下来我把这个脚本拿到我们的项目当中啊。
64:30
Ctrl a ctrl c,那到我们的项目当中啊。102。CD到并目录啊,这然后vim一个,这叫什么呢?My circle_to to谁啊,HDFS,注意啊,我们现在是全量叫做for.sh。好,YVM。
65:00
然后回声完事,我把它右键粘贴进来,粘贴进来之后冒号。WQ保存,哎,然后呢,我给他一个权限啊,Ch mod777,哎,777MYSQ啊OK好了,那这个脚本我们在执行的时候,你说我们应该怎么执行呢?嗯,My circle。下划线to hdfs,负点SH,那第一个参数我们应该执行啥呀?哎,肯定要传一个O嘛,对吧,执行所有啊,来一个O好了,那第二个参数你说我们要不要传呢。要不要传,我传不传它都会有一个值,如果说我传了,我可以自定义一个,那如果说我不传呢,它会获取今天头一天的数据,那为什么获取今天头一天呢?这个地方我们就要想一想了,因为我们这个脚本是每天凌晨执行的,那凌晨我们要处理头一天的数据啊,所以说我们要获取头一天的日期啊,那我现在执行我获取头一天的日期是获取5月19号的日期吧,那肯定是不行了,对吧?我们没有5月15号的数据,5月19号的数据,我们在这个my soq当中的数据是6月14号啊,那现在我们就知道了,在生产环境下,我们这个脚本就传一个哦,就完事了,哎,让它自动获取时间就完事,但是我们现在是测试啊,测试,我们就要给他一个测试时间,哎,我给他来一个2020杠零六杠一。
66:40
四好,那完事之后,接下来我一执行,我们看看啊,它能不能写进去呢?哎,你看它这个地方判断了,我这个路径不存在,不存在正在创建,哎创建完了之后,这个叉from阿里巴巴啊啊啊开始执行了解析,解析完了之后啊,第一个表写完了,哎完事之后他立即执行第二个啊。
67:04
啊,立即执行第二。那我们稍等一会啊,等第二执行完,那一共是15个。好,ID2完事了,那我们来HDFS上看一看吧,好,来到HDFS的根目录。呃,Originate gmail,注意现在有两个了吧,Log是用户行为日志啊,但是我们现在是业务数据了,来看这个DB,那DB里我们是按表来进行拆分的呀啊全量的吧,你看杠负,那如果说稍后我们再同步关增量就是INC啊这后缀啊,点一个看看吧,Active in份,你看中间又包裹了一层日期,那如果说我们又同步了15号的再来一个文件,16号17号,哎,等等等等啊啊进来之后啊,写进来了没有问题,好,那这个地方我暂停一下啊。
我来说两句