00:00
好,接下来呢,我们来写一下它对应的map h map,那map里面我们关心的就是它谁是key,谁是value,对吧?那这里面的K呢,很显然就是用我们用的PID啊,它作为key,那TPID是什么类型,是实质类型啊,那就test呗,Test,那它的value value我们就用这个刚定义的table b呗。来进行一个传输,好,那下面我们来处理一下哈。嗯,第一个类右键。这个呢,叫。Table。Map。OK吧?那我们定一个类,继承map。OK,长的那首先传进来的是long。Able对吧,天一亮第二个呢是test一行内容,第三个我们这里面输出的是谁呀?PID,那PID呢是词句类型那对应的。黑包B。下面这个,嗯,好,那这样就搞定了,那搞定之后下面我们开始写代码,那写谁呢先写。
01:05
Set初始化方法。这里面叫初始化。我要为什么要初始化呀,还记得我在输入端有几个文件,不啊,我输入端有一个叫order。对吧,还有一个PD2个文件呢。给你们看一下我的输入内容。在。地盘。Input。Input里面找一下input。Under啊,有没有table,哎,这样的table看到没?一个是凹表,一个是PD表,打开凹表长这样,ID,商品ID和商品数量,那另一个呢,是好。定出来吧。两张表。OK。代表。好两张表有了哈,我这个盯盯这个吧。
02:01
大一点。把商品的名,把这个文件名称给他定出来,行,那这两面有了,有了之后我需要干什么事呢?我初始化的时候,我希望就能够获取到对应的文件名称。然后进行后续的操作,效率要高一些。对吧?哎,那我们来看一下啊,我这里面如何来获取每一个文件的名称。怎么获取?那怎么获取呢?Contest点儿。Get。Split再点。得到一个切片信息。然他那你看一下这个input啊,点进去它是一个什么。它是一个抽象类,那抽象类能用吗?CTRL加下去,我得用它的子类啊。那子类这里面你看一下都有谁。有file split是map right包下的combine他啊还有什么DB,那最后一个file input啊,File split map6包了,那我用哪一个,是不是用它呀?哎,File split,因为我们读进来的就是文件的。
03:10
那就按照这种方式进行切呗。好了,那我们回到这个map。这地方我就把它变成。Split。对吧,哎,就用它那倒班的时候注意了alt加回车。到长的。对吧,分之六十,然后提示你强转。旋转一下就可以了。那这个收来来收起来。好收起来,那之后拿到这个切片信息之后,那下面斯普利特点。Get pass.get。Name。点,那现在这个呢,就是fair。那我为什么要在这个setup里面去获取这个file name呢?你看啊,我们的切默认切片规则是不是一个文件一个切片呢。
04:01
对吧,按照文件进行切,那按照文件切的话,我这个pd test进来是不是会执行一次map test,那每一个map test里面是不是都有一个SET2方法,还有对应的map方法。那我下一个文件的时候,它是不是也有S德方方法和麦克方法。那我这一个文件,我是不是只需要执行一次set,阿法拿到这个名称,然后把后面的内容处理完。就好啊。如果我不提前拿这个名称,我在这个把这个这步这样。我写一下啊map。向程总,如果我把这一步的获取我放到这儿行不行呢?行,那就是每一行我是不是都要获取一下当前这个文件名称。反过来我提交到上面去。我是不是一个文件获取一次,因为一个文件会开启一次map。那我只获取一次就行了,那哪个效率高,它显示这种效率高行,那下面这个文件后面要用对不对,我得把它变成全局变量alt啊ctrl alt加F。
05:08
哎,生成属性。那后面就可以用了,OK,那这是第一步把这个搞定,那下面就开始处理呗。那不管你进来的是PD文件呢,还是out文件呢,那是不是都是一行一行的内容啊,那我怎么办?第一步哎。获取一行。都是老套路啊,value.to使劲点。来得到这一行,得到这一行之后,下面再操作的时候就有变化了。就得判断。是哪张表的哪个文件的吧。对吧,那怎么判断呢,这块。衣服。If是拿它去判断。这是我得到的文件名称,如果说它点contains。如果包含。
06:00
Or DR?啥意思?如果我包含order这个名字对吧?Order,我这个得到的file name是不是order.t啊,如果这里面包含order,那说明我处理的是谁?处理的是。订单表对吧,那再来else。一共就两张表,那我另一个处理的。是产品点啊商品点。行,那下面我们分别处理,分别处理,包括这个切割我都给它分别处理点二斯布利特啊切这里面它用的虽然说都是用的斜杠T。但是给大家思考一个问题,如果说这两个文件中间的分隔符不一样,那就不能招人了吗?能啊对吧,那我你看我分别处理之后,你这个是斜杠T,假如说这个斜杠T,我下一个是空格。没问题吧,那我就分两个分支对吧,这也是用斜杠T,那我下一个空格不就搞定了吗?哎,所以说我尽量往这里面放啊行,那这也是切割出来。
07:04
我是order表,那order表对应的这个呗。那你看怎么处理。怎么处理呢?那我下面儿是不是要封装了。封装对应的K和V。那封装我的什么?Table对吧,那你得定义啊。Private,我定一个test,那test叫。Key。它等于你有一个。Test,别找书包了。OK,那再来private这个呢,是。Table。B,那我这里是奥V。等于又一个可包B好。对吧,哎,搞来搞来之后,下面开始往里面封装,封装KV,那out先封装这个key吧,Out key第二。
08:00
那你set你看啊,我现在呢,是这是lit切割出来,谁是这张表的这个key啊。定单ID,这是不是PID对吧?IPID,那你是PID,那我怎么办?斯布利特取出。第二个字段那是几啊零一呗,对吧,从角边从零开始嘛,啊1OK搞定。那下一个out铺的V封装V v.set set的话,我们第一个。是不是啊他呀,哎,他是不是ID叫ID。那ID我取出来值就是斯布利特第几个,第零个呗。那再来那下一个output v.set PID吧。第二列不就是PID吗?啊PID,那PID的话,我这里面就是斯普利特切割出来第几位,第一位再来。put.set我现在要set的是amount,是不是这列数量,那你这列数量。
09:00
那我叫斯普利特。你发现报错了,原因是因为它是什么类型,是实际类型。那么这里需要一个。是不是int类型啊,In t.pass把它传去。这不就搞定了吗?啊,那行,你看这张表完事了,三个字段,那接下来说这张表,这张表里面是有一个,呃。产品名称啊P吧,然后还有一个flag标记,那行,那这个必须要给啊,不能说没有就不给了,你不给的话都会报序列化,这个有问题哈,我下一个呢叫set。呃。但这个名称有吗?我奥表里面有名称吗?很显然没有,没有就给个默认值这就行了。对吧,我是死类型吗?OK,这个默认值好。Out put v.set现在的我这个flag。那我这个表是什么表呢?Or的表。是不是就行了,OK,那下面我们来这个封装一下它PD表。
10:00
那PD表的话呢,仍然是line点斯普利特啊,切割斜杠T。电话。当前的。对吧,我名称定义成一样没问题吧,嗯,这是中域的问题哈,没有问题啊,然后进行封装,Out k先K吧。赛特斯普利特,我取出第几个是它对应的K呢,就是PID出第一个就是,哎,那就零呗,给个0OK。那再来out put v啊v.set那我们还是从这个订单ID开始。那订单ID有没有没有没有鬼空再来。二的v.set订单ID之后,下一个是PID吧,PID拿过来PID我这里有的,那我取出来的是斯普利特T。是不零啊,还是零吗?嗯,OK,再来out put v.set PID完事之后是amount。
11:02
额曼的数量现在是多少呢?没有啊,你这个PD表里面根本就没有,我骂他,那就零呗,嗯,默认值。再往下out put v.set之后。哎,这个name可有了哈,Name有了,那就是斯普利特及一。第二位。那最后再来一个out put.set flag。啊,Flag,那flag的话,那这里面我给一个PD表,你看out put key和V就设置完了啊,一点点设置哈,那最后呢,写出。写出呢,就是contest.output output v。嗯,行了。看着挺复杂的,其实写起来还是比较轻松的啊,嗯,我们来看一下啊,这里面首先解决第一个事儿啊,要获取你对应的文件名称,记住这是一个优化的手段,因为每一个map task都会只调用一次,那我每一个文件我只希望它调用一次,获取一次名称就够了啊,那把它拿到对吧?那接下来map里面其实就是获取一行,然后切割,只不过切割完或者切割之前要判断你是哪一个文件的,如果是A的,那你切割出来它是有三个列,那如果你是这个PD表的,那只有两个列,那封装的时候要注意小心对应取值就可以了。最后呢,写出。
12:30
这就是慢阶段。
我来说两句