00:00
好,接下来我们来看一下招的多种应用在企业开发里面啊,招呢是一个非常重要的一项技能哈,呃,像我们hi多op里面有招引,那我们在学买circleq的时候是不是也有招?后面我们要学到have Spark flink里面也有对应的噪音相关操作。那好。那问一下,问大家一个基本的问题,说两张表啊进行招引。怎么能够招人的上?对吧?哎,那他们两个表当中是不是得有公共的字段呢。哎,这两个时段能够相同,能不能关联上。是这样吗?好,那比如说我们看一下这个需求啊,先看一个需求说呀,我们有两张表,一张表呢是订单表,还有一张表呢是商品表。订单表里面三个字段分别是订单ID,商品ID,数量,那这个呢是商品ID,商品名称,那如果想让这两张表进行招音的话。
01:00
得用哪个字段进行关联呢?很显然,我们只能用这个PID进行关联。那如果这两张表进行关联之后,我想要实现一个什么效果呢?哎,我想希望实现的是把这个ID。替换成对应的PIN。哎,那怎么替换,比如说它后面换成他,他换成他,然后这个不要了。这个放成一个P。啊,那订单表里面就变成了ID amount。这样一个效果。好,那我要想实现这种效果。那如果我们用MR程序来实现,那我在map端要做什么事?Reduce端要做什么事?思考一下。对吧,哎,那好,我们来看一下这个PPT。首先呢,这是输入的两张表,一张表呢是凹的表,另一张表呢是。啊,那这两张表。然后输出呢,希望输出成这样,比如说把这一列相同的替换成对应的商品复制过来。
02:07
对吧,复制成商品复制。那我们一个一个问题解决哈,首先我们解决第一个问题,我在输入文件当中有两个文件,一个它,一个它。对吧,哎,有两个文件,那有两个文件,我要去读这个文件的时候,我怎么知道我读的是它,我怎么知道读的是这个。因为这个对我很关键的,如果我读的是这个order表的话。我这里面是未来切割的时候,切割出来应该是三个时段。好,那如果我是这张表呢,我切割出来之后,我是两个字段。那就决定了我未来我这个数组怎么创建。是这样吗?那这个名称怎么获取到呢?还记得我们之前学过一个切片那个源码吗?切片源码里面是不是能够获取到这个文件放在哪一个路径上,以及这个文件的名称啊?
03:01
诶,我们就通过这个切片就可以获取到对应的这个文件的名称。首先拿到切片,拿到切片之后有一个get.pass。啊,Pass get pass之后,然后get name,就能够获取到对应的名称。哎,第一个问题解决了。解决完之后,那接下来我们想把这两张表的数据传输到reduce端,进行后续的一个招引。对吧,我们叫radio噪音吗?那思考的问题。我传输到radio端进行招引,那我一定是要将比如说这个PID相同的内容传输到radio端嘛,然后把这个PID替换成对的小米,这小米。这效果。那如何将这么多数据聚合到同一个reduce的方法当中呢?的方法是相同K啊才能进去啊,那好,那我这个map task的输出K,输出的KV怎么设置。
04:04
设成什么?只能设计成你这两张表中间的一个关联字段,把它作为key,我才能有希望将这些内容是不是传输到一个里面去。对吧?好,那我们就将它作为K,它作为K,那我首先读的是,假如说读的这张表,那它是K的话,我怎么封装呢,这是K。那Y流丝取谁呢?我Y流取个,他取个,它还得取一个表的名字。那一个是订单ID,另一个是订单数量。再加一个表的名称。过来。OK吧,那好,那我这个PD表呢,PD表这是PD。PD的PID,然后商品名称。之后呢,是我找哪张表来的,这个很关键啊,这个标记标记我这个数据是哪来的,这样我们传输到radio之后,才能够清晰的判断你是这张表来的还是这张表来的,然后进行后续的一个招验抄送。
05:02
OK,好,那既然说我这个PID啊,作为key了。那后面Y流这是几个字段呢?是有多个时段的。那多个字段就涉及到数据的一个序列化。对吧,你map太往radio传输的时候,中间有可能跨服务器传输。你要进行序列化好,那序列化的话,那这里面我要把这些内容是封装成B对象啊。对像。那封装成并对象,我这个并对象怎么设计呢?你看啊,我这个Y呢,一会儿是这个,另一会呢又变成他了。那我怎么能覆盖你所有的value溜呢?思考一下,那只要我设置这个table b足够长,你的比如说放在这儿,你的我放在这儿,好,你这个再来一个字段,第三个字段的吧,对吧,能满足你out了吧,我再来一个PD的pd PID,这前面有了,那我不设置了,产品名称我再封了。可以吧?哎,再来一个你这个标记flag。
06:03
OK。我设置这么几个字段,把它传过来。那我就不管你是order表还是PD表,我都能够把信息传进来,那好,那大家思考一下,那如果我传过来是order表的话,我这个表怎么复制?那首先第一个ID。呃,1001,没问题,能回来ID01数量一,那再思考我是奥表,后面怎么填?后面的话,你这个产品名称是没有啊,没有空呗。打这个双引号空,那flag写什么?Flag写呗。写成ord。这不就行了吗?那下面这个下面如果我是这个PD表,那PD表我这个table报表。哎,我这个知道怎么封装,那首先订单ID有没有没有没有空对吧,复制空。啊,然后PIDPID有PID是零幺,那再来数量,数量没有零,嗯,然后呢,又是PI,嗯,接下来是产品名称对吧?诶产品名称复制过来小米。
07:00
然后后面表明着PD。这样的一个table包B不就封装好了吗?比如说我这个table包B呢,尽量包含这两种value都有。一复制,OK。那好,Table b封装完毕之后,那接下来看一下map test里面是不是默认对这个K进行排序啊,还记得不?这有快台有规定啊。那好,那它就会将这个相同的这个K是不是放在一起啊。对吧,在分区内部排序吗。那放到一起之后,你看那是不是这一撮。对吧,K相同吗?那这个呢,是奥德表的,这是PD表的。OK,那未来这三条数据就会发送到一个reduce方法里面去,那这三条呢,发送到另一个reduce方法里面去,它在发送另一个reduce方法里面去。对吧,执行三遍嘛,因为你每每一个K进到一次研究方法。OK,那如果将它发送到一个reduce里面去,那你怎么处理呢?
08:01
那就太简单了。对吧,哎,我创建两个集合,一个用来存储。Order一个用来存储小米,哎,也就PD表两个集合,两个集合,我这个al表是不是比较多呀。对吧,哎比较多,假如说我这奥德表有十个十个并对项。那十个B对象,我就循环for循环便利你这十个B对象。变了它之后干嘛呀,我给他bin对象里面这个pd name设置。诶,这个产品名称设置。Set set,谁取?从这个PD里面取值,然后给这个for循环便利这个集合按里面填数。啥意思?举个例子,比如说我这里面有for循环。十个并对象。那我取出来第一个宾对象,然后点set产品的名称name。那name里面是谁呢?我设置的是从这个集合里面取出来,就get get它是不是就能够取出来对应的产品名称啊,然后复制给他不就行了吗?最终一写出。
09:05
来你有几条我就变了几条,一个一个设置。能懂吗?那这就是整个程序的流程哈,那下面这是一个task,哎,对数据呢,进行一个合并,合并完之后最终就长成这个样子。好,那先分析到这儿,接下来我们写一下代码。
我来说两句