00:00
那现在这个双击,嗯。嗯,把这文档打开。好,这个我得调大一点啊。啊,那这是咱们这个scoop的这个文档,呃,Scoop这个使用原理其实很简单,前面不是讲过SCO就底层就是一个map producece,我们每导一次数据就就跑1MR,那这个MR呢,其实只有map,没有reduce啊,因为它只只传输数据,也不用聚合,也不用计算,所以只只是一个map,一个map就够了啊好,那现在呢,我们来看看啊,那SCO在使用的时候呢。主要就俩功能,一个是导入数据。导入指的从哪往哪导,指的从关于数据库往海杜op生态去导,对不对,那导出指的从哪往哪导呢?导出指的是从哎海杜op生态往咱们的这个,呃,这个买S狗或者关心数据库里边去导,是这样的啊好,那现在我们来看一看这个导入呢,大家前面都会了,对不对,那我们导入的时候啊,其实我们这儿支持什么呢?支持。咱们这个数据从关型数据库往HDFS上的一个路径上导,能够这么去导,还能支持什么呢?还能支持把这个诶买词库里边的数据呢,直接导入到一张汉户表里也是可以的,还可以怎么导呢?还可以支持咱们把这个买词库当中的数据呢,导入到咱们的呃,H base的一张表里是都支持的啊,是这样的,这是我们导入的时候,咱们库它它所支持的东西导到H一个路径,导到have的一个表,导入h base的一个表都是可以的,但是我们更常用的还是把数据导到h.FS更常用一些啊,是这样的,那导出的时候呢,导出它可就不一样了,我们导出的时候大家要记住,导出只支持把HDFS上的一个路径。
01:43
里边的数据呢,导到咱们关系型数据库里边。只支持把一个路径的数据导出到咱们的HD,呃,导出到那个惯性数据库里是这样的,这要记住要记住啊,那这边那大家可能会觉得,诶,那这个文档上咱们这个标题起的是什么呀,是haveve加hfs到关于数据库啊,嗯,这个是为什么呢?是因为啊这个所谓的把haveve里边的数据导到这个关情数据库,其实也是利用的什么呀,也是利用的一个路径,我这只不过是什么呀,把have物表它所在的那个路径放在这个位置了,那这个是不是就间接的实现了把help的一个表导导到MYSQ里边来。
02:22
其实说白了,他这边还是路径,还是路径,只是路径往外导好,那我们来看导出的时候,我们这边。这个参数大致有什么?简单来看一下吧,这块比较简单啊,这三个参数应该大家都知道这是干什么用的,是不是连MYSQL数据库的呀,是吧?那下边这有一个table。大家可以猜测一下,你说这个table指的是什么?是have the table,还是my circle table?大家要注意啊,这个table指的肯定是my circleq当中的一个table,这是为啥刚才前面强调过了,我们往外导数据的时候,导出的时候只支持路径往MYSO当中导,对不对?所以说你这不可能是have的表,是不支持这些导have表的啊好,那它完之后呢,往下看下一个这一个number maps,就是map的个数,这个不用多说了,在下边呢,有一个export d。
03:11
它指的是什么呢?是就是咱们刚才说的那个导出的那个路径,就是你要把哪个路径的数据导到MYSQL里边啊,对不对,需要用export d去指定,那下边呢,有一个这样的参数,这个参数大家要注意啊,参数叫做input field termin这个它的这个参数名大家一看就知道什么呀,是这个分隔符对不对,那这个分隔符呢,大家到时候写的时候还要注意一些。注意什么呢?大家想想啊,咱们现在是需要把HDFS上,呃,需要把咱们数仓的ADS层的数据是不是要导到买SQ里边啊,对不对,那买SQL里边肯定得是结构化数据,那所以说你这得得指定什么,指定你have里边你那个数据那个表的分割符到底是什么,是杠T,那你这边呢,就要保持杠T,那也是这个位置呢,要求跟什么要求和我们AADS层你的表的那个分隔符要一致才行,要不然这边是识别不了的。
04:03
所以说这个大家要注意啊,就是这呢要跟ADS层的表保持一致,Ad表一个啥大致呢,就是这样的几个参数,好,那这个导出呢,咱们基本上就就这些就够了,那接下来呢,我们看看咱们最终这个导出脚本是怎么去写的啊,那这是这个文档关掉不要它了,看咱们现在这个文档上的导出脚本。来,大家一起往下看啊,这边呢,我们起个名字,你叫这个scomport.export.sh也行,或者一会咱们给它叫个别的名字也行啊,一会再说,那现在我们看这个脚本的内容,这个脚本的内容呢,其实跟咱们前面写的那个SCO,呃,Import那个其实是那个,呃,就是那个,不是school part就是那个,呃,My circle到HTFS就是那个school的导入脚本,就跟那个结构是很像的,那咱们现在就不再手写了,给它粘出来,然后给大家解解解释一下我这个脚本是怎么去写的啊。C。来我们一起看一下啊,大家来看,首先前面呢,声明了两个变量啊,一个是呃,Have当中你那个数据库的名字,一个是咱们my circleql当中那个数据库的名字,我们买circleql当中不是刚才刚建的吗?叫做机贸report,是不是就做报表的一样这样的一个库,那下边我看这个,我这个这个脚本是怎么去写的,它结构是什么样的呢?来先看结构啊,这是export data这样的一个公用的一个函数,跟咱们那个导入的时候是不是类似啊,那下边呢,哎,我做了一个什么呢?做了一个这个判断,咱们判断一个参数。
05:30
诶到一,那如果说这个脚本,我第一个参数我传的是什么,传的是哪个表名,那我就导哪个表。传的哪个表我就导哪个表,然后如果说我传的是哦,那OK,我就把所有表都导出去,把所有表都导出去是这样的啊,那咱们ADS层一共有几张表,一共是不是有19张表啊,19张表,但我这边没有把这19张表都写上啊,呃,要都写你就呃就照着写就行了呗,一从从头到尾一个一个写就行了,那这边我只写了三个啊,咱们就那个把那个意思呃达到就可以了,意思达到就可以了啊好,那正常你在公司里边是需要都写上的啊,有几个表你写几个表。
06:07
好,那现在呢,我们来看看这个公用函数我是怎么去写的来。首先这个里边呢,我们用这个op BT modu scoop b用这个,这是一个什么绝对路径,调用这个scoop的脚本,然后传export,这回不一样了,是export了导出,那同理,后边我要写一个connect,写一个username,写一个password,这个需要连咱们的MY,这个大家正常写就行了,这样写就行了啊,那写完之后咱们看下边,下边这个位置啊,看这。这个table,呃,前面一再强调这个table指的是什么?Table指的是my circleq当中的table my circle当中table啊,那这边呢,我们,呃,因为这是一个公用函数嘛,我要呃所有的导每张表都要用这个函数,所以这个表明呢,肯定是不一样的,所以说给它做一个参数,做一个参数啊,那大家这块要注意这块,这个DOLLAR1跟这这个DOLLAR1它一样吗?它俩不一样,这个一定一定得知道啊,那这个DOLLAR1指的是什么?指的是咱们这个函数的第一个参数。
07:04
对不对,诶,那这个W1指的是什么呢?只是咱们这个整个脚本的第一个参数,所以这块呢是不一样的,不要搞混了啊好,那下边呃,Map的个数是一,这个不用多说了,那这个导出的路径,诶这个东西你看看他他咱是怎么写的啊来。导出的路径啊,咱是不是就得找咱们那个,呃呃,咱们那个数那个数仓ADS层那个表的路径啊,对不对,ADS层表示路径在哪,在warhouse下边,在这个g Mo下边,然后ad层,那接下来后边是不是就表明啊对吧?表明就表明咱们还是用这个DOLLAR1去给它传就行了,那这时候如果说你这个脚本这么去写的话,那就要求咱们这得保证一个事,什么事呢?就是你数仓里边就是have当中ADS层的表明得和你买SQL当中的表明得是一致的才行,对不对,那这时候你才能共用这个DOLLAR1。要不然的话,你这个共应不了,所以这边要求ADS层跟MY当中表明是一样的,好,那他完之后呢,往下看,这个是咱们这个field term by,杠T,我们ADS层就是杠T,所以这块呢是没问题的,那接下来还有几个参数,这四个参数。
08:09
这是比较关键的。这是比较关键的啊,那我们来看一看这几这四个参数,这四个参数呢,我们可能有两个比较熟悉,比如说他们俩这是比较熟悉的,那这俩是干什么用的来着,咱们scoop导入的时候是不是会有一个no string和一个no ne string啊对不对?那导入的时候你指明的那个参数是什么意思,还记得吗?是不是咱们买SQL里边的空值,我导入到have当中,或者导到HTS上之后,我以什么样的形式去存储啊?对不对,那我们have表里边,诶,它默认的这个空值是谁呀?是不是杠N呢,所以说我们导入的时候需要告诉咱们这个四库吧,买斯库当中空值。到了HDFS这你需要给我存成杠N,当然这边我们需要转移,需要加一个反斜杠转移一下,好,那这是我们导入的时候,那同理咱们导出的时候也得考虑这个控值的问题,就是说。
09:00
我们have当中也是HTFS上我什么样的值,我导到my soql当中,我给你存成MYSQ的空值对不对啊,那是不是应该就是杠N,我存到MYSQ之后是空值啊,也要告诉他啊,也要告诉他,那这边呢,诶我们就给他配上就行了,一个是这个字符串类型,一个是非字符串类型,咱们都是杠N,都是杠N啊,那这边大家要注意这个参数名跟导入的时候不太一样了,那那导入的时候没有这个input的啊,那这边有一个input,包括这个分隔符是不是也前面多了一个input呀。这照他这个做就行好,但是这两个参数咱们就介绍完了,然后介绍完之后呢,我们再来看这个位置。这个位置呢,有一个什么呀,有一个update mode,还有一个update k,那这俩参数它的作用是什么呢?这俩参数它的作用是什么呢?我得给大家解释一下了,大家来看一看啊,咱们这个死库往买搜索里边导数据的时候。他其实没有那么灵活,没有那么灵活。大家可以回想一下,我们此库房从买circle往HDFS上导的时候,咱是不是比较灵活,我可以怎么样,我可以通过那个circle去去导我想要的数据。
10:07
对不对,比如说我增量或者是全量,我想怎么导就怎么导,对不对,但是咱们导出的时候,那可就没有那么灵活了,我们导出的时候只支持什么,只支持把一个路径里边的数据是不是导到MYSQL里啊。那既然是这个路径,我们这是不是写的这个表的路径,那这样一来的话会出什么问题,是不是咱们每次往每次库里边导的时候,我都是怎么导,是不是都是全量导啊,每次导都是把整张表的数据导到MYSQL当中,每次导都是这么去导。那这样一导的话,如果说我们这个数据不做任何处理,那买思当中是不是势必会出现这个数据的重复问题啊,对不对,每次都往里导,每次都往里导,那我可能前面的那个导过的数据还会再导一遍,那是不是肯定会重复,对不对?那所以我们这儿是不想不想出现这样的,不想要这样的现这这不想要这样的这个效果,我们想要的效果应该是什么样的呢?我们想要的效果应该是这样的,咱们这边是不是只能是每次把全表都导出去,我们想要效果应是这样的,对于已经这个在买搜当中存在的数据,我怎么做呢?已经存在的我给他更新。
11:09
所谓的更新呢,就是诶把这边新导的这个历史数据呢,诶给他把原来的那个历史数据给它替换掉,但其实他替换了之后,他这个结果会变嘛,其实不会变的,其实还是原来那个结果,对对不对,也就相当于什么,我已存在的数据不动,但其实它是一个更新的过程啊,就是已存在的不动,但是对于新新的数据呢,我是每天会有一条新数据产生,或者是多条,对吧,对于新数据呢,我怎么办?诶我给它插入。给它插入,那这是我们想要的效果啊,就是说已存在的更新这个不存在的呢,我给它进行进行进行insert插入对不对,那这边我们应该怎么去配置scoop才能实现这样的效果呢?通过这俩参数啊,通过这俩参数啊,这俩参数,那也就是说咱们诶把这个update mode是不是这个更新的模式啊,更新模式我们给它设成allow insert。大家要注意啊,咱们这个更新的模式呢,有这样的两种类型,一种是咱们这写的这个allow insert,还有一种呢,是什么是这个,诶update only update only,这个在咱们文档上其实写了啊往下看诶一共有这样的两个。
12:16
Update力呢,是只允许更新,不允许插入,那这样一来我们新数据是不是就插不进去啊,所以说这种方式咱们不能要,我们得要哪个要allow insert,就是说诶已存在的我就更新,未存在的呢,我就insert,我就插入,那这才是我们想要的效果,OK,那所以说update mode呢,我们在这需要给它设成allow insert,那还有一个下边这个update k是什么意思呢?Update k,这个K呢,需要我们指定一个什么东西,指定一个字段,这个字段呢,我这个字段呢,我们要求得指定一个什么呢?得指定一个主键。诶,或者说至少要是一个唯一键才行,就是唯一键才行啊,不一定是主键,但至少要是唯一键,唯一键啊,就是这个那个只能是唯一的,不能重复的这种啊,就是UNUN那种类型,好,那它的作用到底是什么呢?给大家解释一下,前面咱们讲了,如果说我配置成这种更新模式之后,它的效果是怎么样的,就是已存在的数据我更新,不存在的我给它进行插入对不对?
13:15
那咱们怎么去判断我这条数据它是否已存在了呢?他总不能说我每个字段都去比较一下吧,那这样一来效率肯定太低了,那所以说我们这这个字段这个参数的作用是什么呀?就是指定一个字段。指定一个字段或两个字段也行,指定这个字段干什么呢?来,然后呢,用这个字段,根据这个字段,根据你指定这个字段去判断我这个数据是否已存在,也就是说,如果说我这里边有条数据,那你指定那个字段,比如说是一,那我新导过来的数据里边呢,这个字段也是一,那OK,他俩一样,那就证明这条数据已存在,已存在那我就更新,那如果不存在我就插入。诶是这样的啊,那这个就是说诶指定它去判断我这个数据是否存在,那这个字段,这个字段呢,我们要求大家指定的时候呢,诶要指定为我们的这个主键,或者是一个唯一键,一个UN,大家把这个注意,把这个注意到啊好了,那这就是咱们这边这个scoop导出的这样一个配置,Update mode和update key,它的这个配置呢,我们都是这么去配啊,就是说把这个它设成这个呢,设成主键就可以了,那每个表的主件是不是都不一样啊,所以说我在这呢,这个公应函数,我给他做了一个参数,做了一个参数啊,那这个公应函数咱们就介绍完了,那接下来我去导不同的表的时候,那我是不是就需要给他传一个表名,再传一个主键就行了呀。
14:34
穿越表面越主件是这样的啊好了,那这边这个咱们就介绍完了这个脚本,好我把视频录一下。
我来说两句