00:00
好,接下来呢,我们来看一下,哎,这个reducer怎么写对吧,那现在相当于我们的map数据已经到了这个位置。那到这儿我稍微放大一下。到了这辈子,相当于我马上要执行的就是这一组相同的K会进入到reduce方法里面去。那这一组相同的K进来,我怎么处理呢?之前说过,我这里面要创建两套集合,一个集合来存储al,另一个呢,我创建一个并对象也行啊,如果是数据比较多的话,创集合。对吧,那一个是创建一个集合存储order,另一个存储它。存储完之后,我循环便利这个al这个集合,然后把这个值是不是塞进去。实现这样一个效果不就完事了吗?好,那下面我们来写一下对应的这个reducer哈。右键创建一个。Table。啊,这就是。那这个reducer呢,需要继承reducer对吧,选长的,嗯,这个它的输入的KVKV是谁呀?还记得吗?是这个对应的test test对应的是PID。
01:12
那Y6呢,就是对应的这个table包B。那再来,我最终希望的输出长什么样?对吧,最终打印在空台,我打印在空台,我是不是只打印这个table b里的to string方法看。那我还需要对应的value吗?不需要,那反过来,那也就是说这块我叫它的K叫table包。TB,然后value呢,我不用了,嗯,Now right不用了,这可以吧,这咱之前也写过,哎,不要它就放一个now rightable OK。那进来reduce方法好。
02:01
那现在啊,我抓一组数据过来啊。怎么抓一组数据呢?把这个打开右键。打开。打开之后我把这组数据拿回来。哎,你照着写会非常轻松啊,好了。也就是说未来这一组数据会进入到同一个reduce方法里面去,知道吗?哎,那进来的话首先干两件事儿啊,第一件事儿呢,创建集合。嗯,另一个a release,把这个table b。团去。点,那它用来存储order be4。对吧,那这是订单的有了,那我还有一个他的呢,PD的,那PD的有一个。K8V点包,那我这个叫什么呢。PD。就行。但因为它只有一个值嘛,对吧,哎,零一它只代表小米就这么一个值,那也说第一步准备工作有了,那第二步干嘛呢。
03:04
第二步,我得取出你这里面对应的值。对吧,你这里都是table。那我得把你这里的值分别复制给他,再复制给他呀。是这样吗?好,那下面循环便利。这呢叫准备两个集合。OK。啊,那Y流失。第二放,诶。便利。便利他那现在他这里面就是其中的一个。一行内容啊,对吧,一行内容,那这一行内容我要进行判断了,因为它有可能是order,有可能是PD,那怎么办if。啊e if,谁呢?Or啊,这样去写点equals啊,别equals了,嗯,行,Equals也行,那如果说它等于谁。
04:01
等于我这里的value.get。有个flag吧,这。来这个flag里面,你看一下这个map里面复制。要么是order,要么是PD,只能是这两个对吧,那你回来。回来之后,那如果说说哎,它俩相等,那说明什么问题。说明接下来这个处理的逻辑,它是。订单表。对吧。Else。20的话,那我这里面就变成了。什么表?哎,那就是商品表。的一个处理。那先处理它呗,那很显然我这里是个集合对吧,哎,大家的想法就是它,然后点艾直接向里面加呗,加谁呀,加这个Y流吧。往里面加。你循环出来一个,我加一个感觉没毛病对不对,没毛病啊,其实这里面有坑的哈,如果说这是正常的Java集合里面的迭代器。
05:03
那没有任何问题,你便列出来一个往里面填。对吧?哎,我出来一个对象,相当于是我出来一个对象给你这里面添加一个,这是一个奥瑞,然后再出来一个,再添加一个,然后再出来一个,再添加一个,对吧?但是在这个大数据hi多这种场景下。你这种呢,会存储多个对象放在这里面。那hido就对它进行了一个优化,它怎么优化了呢?他这样的,你往这个奥倍里面存的时候哈,它这样你迭代出来的对象,它只是给地址。给地址,而且会往这里面一直覆盖,你第一个值给过来,他把你地址给过来,那第二个就把地址给过来,第三个给过来第四个。那结果就是第五个来的时候,会把前面的全都覆盖掉,你说这种话,你最终只能加深来一个对象。并不是你想要的。多个。这是嗨度把他自己源码改了啊导致的。那怎么办呢?那我们就需要这样的一个做法。
06:00
我先把这个值啊,我先复制给一个临时对象new了,每次都new一个对象,那new个对象,那我这里面是不是就保存值了,保存这个值new的这个temp,再复制给它orderin司就没问题了,那每次呢,它给过来的都是多个对象。每次你一个。就可以了。啊,你千万别直接把它给过来啊,直接给过来是给的地址啊好那行,那这块呢,我们要处理一下哈,说我要用一个叫ta。哎,这样啊。有一个推包臂。假冒。那起个名字呢,就叫tap。这样行吗?你看我每次循环变历这这个循环便利是不是都创建一个对象啊。那我这个对象的地址是不是每次都变的,你都是新对象吗?对吧,我把它,呃,我把这个,我把这个Y流值,我每次都附给一个新创建的time对象,然后我把这个time对象添加到这里不就行了,把这个添加进去。
07:04
那现在要做的事情,你创建完这个对象,它的值怎么用它把它给给过来。是这样吗?哎,那其实呢,有一个工具类,这个工具类呢叫bin。S。点copy purpose,那你看一下它的这个输入参数,第一个呢是this。哎,相当于是目标地址,你要给谁赋值,那另一个呢,是原始数据,那我要给谁赋值啊,我要给的是不是他赋值。我往这里面付,那把谁值的给呢?把它的值给过来。我是实验这个效果对吧,那这里面有异常抛出来啊,踹踹上对吧,啊踹一脚。搞定这地方注意哈,这个呃,对于好多同学啊,这个刚学啊,他不知道,以为这是就是真正意义的迭代器呢,啊其实呢,海源码已经给你修改了,那这块遇到这种场景要记得复制对象。行,那他完事之后,那下面我们来处理一下这个商品表,那商品表直接就ban us.copy part,我要向哪里复制啊,我要向这里面复制。
08:11
那把谁值给回来呢?把这个Y流值给回来。然后踹一下,为什么这个就一步就完了呢?因为我进来的数据是不是只能是一行啊。你看这个表是不是都是一行对吧,PID只能是一个,那我就简单了,就变变了一次啊,你设进来直接拷贝过来就完事了。好,那这个是这块,那我这个处理完毕了之后,就是放循环啊,对一下这个这地方。放循环处理完毕之后,那下边就相当于我要干嘛呢,循环便利。便利。这个。鬓丝。然后复制。Pd name。
09:00
啥意思,也就是说现在啊,相当于我这个奥斯里面已经满了,把你们这里面的值这个。截一下嘛。好了啊,现在相当于我这个order bins里面,假如说这里面有两条,我已经存储了两个order,然后我现在要干什么事儿,我循环遍历这个集合。然后往这里面对应的pd name不就行了吗?好,那我们来试一下啊。Order bans.for便利哎,取出来一个,取出来一个之后,它点set,我现在是谁set它的默认值什么?记住默认值是不是一个空啊好,那我这个值从哪取啊。从哪去取,这个很关键,那我是不是有PDB的,它里面有对应的get name。因为我这个新债封装这个PDB,它是不是这个ID。
10:00
ID跟我上面的数一定相同啊,那我是不是直接取出来赋值给它们,是不是就没毛病啊?对吧,因为ID相同的,OK,所以说现在我直接取出来复制进去。那复制进去之后,那下面输出呗,contest.right写出,那写出的话,那K是谁呢?Order b。那B,然后Y6 Y6是空now right点。你看。这就OK了。那这是整个的一个,嗯,Reduce,这个reduceer对吧,Reduce。行,那这个你写完之后呢,下面我把这个驱动写一下啊,驱动的话,我这里面就直接复制粘贴了,因为咱们已经写过多遍了,呃,如果你还不太熟的话,那你再写一遍,如果你也比已经已经比较熟了,那就不要再写了哈,有点浪费时间。创建一个table。好搞定。搞定之后把这个代码拿回来。记住哈,越是成熟的代码一定要越小心,你别看是库粘贴这里面啊,你要不小心导包还是真容易出错,首先第一个out加回车,导包看着点high do OK,第一个下一个test out加回车,我们导的是它,没问题。
11:14
再往下file input。老长的。Pass。到的。Fire out,不慢的。导长的。OK吧,哎,现在就OK了,那OK了之后啊,你看一下这个地方。输入路径和输入路径,那这也要修改一下啊,我们的输入数据在哪呢。打开。地盘。Input input table这个路径下。过来。啊,对吧,那它的输出路径我写一下。还毒吧。下划线output有没有看一下啊?还有do out,哎,都是空的哈,那我就来个一吧,都是空的。行,那现在就写完了,写完之后呢,我们来执行一下,右键执行。
12:03
看看能不能一变成啊。OK,执行完毕,执行完毕之后打开右键打开。对吧,哎,这就是我们想看到这种效果啊,把这个呃,中间这个pd name PID换成了pd name pd name p name。哎,这就是最终的一个实现结果哈。
我来说两句