00:00
好了同学们,那我们接下来来讲下一个知识点啊,咱们叫RDD的分区器,这个其实啊,咱们之前呢给大家讲过,咱们之前给大家讲过啊,只不过我们当时讲的是他默认的那些分居器,比方说哈希partitioner对吧,还有那个叫做partitioner,还有叫p parter,只不过那个p part一个它内部的操作咱们可能暂时用不上,对不对,所以啊,这个呢,咱们其实之前讲过类似的,但是我们现在要给大家讲什么呢?我们想自己写一个分区期啊,咱们想去写一写,那么想自己写的话,那就意味着我们的数据要呢,按照咱们自己的规则放在不同的里面去,所以啊,同学们看我们这里面呢,咱们写上什么呢?咱们new,咱们创建一个它咱们叫。来part叫partition啊,简写了一下,嗯。然后呢,在这里呢,我们new创建一个SPARK01啊零幺,然后呢叫做RDD,咱们叫part,好放过来,放过来以后写上一个man,嗯,好同样道理啊,把基本的代码给它准备好拷贝。
01:11
好,然后呢,接来是SC点我们的stop,那接下来呢,我把这个RDD先准备一下啊,咱们写上叫做我们的sc.make r d list,那么写完以后啊,我想干嘛呢?比方说呀,我个人比较喜欢打篮球,那我如果喜欢打篮球的话,我可能就会收到很多篮球相关的一些信息,对不对,那这个时候比方说诶,咱们这么写,我收到了什么呢?我们的NBA的信息啊,最近不是在打NBA嘛,那我们写个叉叉叉叉叉对不对,一个消息啊好了,然后呢,再来再来,再来,那我可能还收到了什么CBA的消息,对不对啊,可能CBA打完了,但也会有一些球员的信息过来,还有呢,Wnba对不对,还有NBA的信息,所以啊,咱们的这些信息呢,千是吧,就是很多种,对不对,包罗万象,可是呢,我对于我个人来讲,那其实我对别的可能不感兴趣,可能就是对NBA的消息呢,比较感兴趣,所以呢,我就希望呀,把NBA的消息呢。
02:12
放在一个特定的分区里面,这样的话我找起来方便,比方说放零号分区,而我们的这个wnba我放在一号分区,咱们C边呢,放到二号分区,就意味着我们跟篮球相关的啊,我们可能就有三个分区了,对不对?那么我们三个分区,每个分区放不同的数据,这样的话我找起来方便,我希望达到一个这样的目的,那么这个时候如果你现在给他写个三就有点问题了,为什么?因为你给他写个三的话,其实他并不能够按照你的规则把数据给他进行分区,对不对?他会按照他自己的规则,他默认的规则,比方说NBA一个分区,CBA一个分区,这俩就放一个分区了吧,诶,老师,那咱们之前不是讲过一些其他的吗?比方说RDD点咱们的cor,我们的这个cor,记住这个它叫缩减分区,它并不能决定这个数据到底去哪个分区,这个做不到啊,还有一个叫reition,这个reition其实它的目的也是为了。
03:12
改变分区,不过他肯定有沙Le,那么你依然无法能够确定他们的数据是在什么位置,对不对?我们说了,我就想放在第一个零号分区里面,你能保证吗?不见得,所以啊,这个时候你就需要自己来写分区器了,所以在这个地方我就写了啊来,咱们写上叫class,叫做MY,咱们叫做什么呢?咱们的partitioner,诶这么写我就写上啊,咱们叫自定义分区器啊,它的目的很简单,它是决定我们数据到底去哪个分区,是这么个概念啊,那好,那我这个该怎么写呢?你随便写一个类就能叫分区器了吗?肯定不是,对不对?所以啊,我们来参考一下咱们之前提到过的一个叫做new,咱们叫哈希,咱们的partitioner,然后呢,我点一下点点完以后,你会发现它有一个构造参数,然后呢,它继承了这个partitioner这个类,这个类是个抽象类,所以它能继承,咱们也能继。
04:12
所以我继承这个叫partitioner,诶就是它了,好拿过来,拿过来以后在这里呢,我们写上一啊,咱们要继承咱们的part这个类,那么你继承完成以后,你会发现在它里面会有两个方法需要重写,所以我们的第二步干嘛呢?重写方法。那么你重写方法的话,来吧,我们重写吧,你重写以后就有两个方法需要你来重写,那么你重写的时候,第一个方法的名字我们一看,哦,叫partition,是顾名思义啊,叫分区的数量啊,嗯,咱们叫分区的数量,那么你自定义分区的话,你得告诉我你分几个区,把哪些数据放哪个区里面,对不对?诶咱们刚才说过了,咱们就要三个区,所以我就固定写个三就行了,如果你不想固定的话,就跟咱们那个哈希partitioner一样,干嘛呀,把它给它传进来,那咱们这就不需要了,对不对?好,那如果你分区数量固定了,接下来往下,下面是什么呢?下面叫get partition,只不过它返回的是一个int类型,所以啊,这里我们就说一下它是什么呢?叫做返回啊,返回我们数据的什么,我们数据的分区索引。
05:30
这个其实int呢是一个分区号,比方说零号分区啊,一号分区,但是零呢,我们一般是所引,所以呢,它表示的是从零开始啊,来说一下从我们的零开始啊,好了,那这么写完了以后,那我们现在有个问题啊,大家看这什么东西,这叫K啊,这个K就表述的什么含义啊,它表述的是你KV数据类型当中的K到底是什么,所以说咱们这个返回数据的分区,所以呢它是有条件的,它是根据我们数据的K值。
06:05
啊,来返回数据的,数据所在的啊,咱们叫所在的分区索引,所以这个时候呢,逻辑就非常简单了,干嘛呢,我们就判断呗,叫做if啊来咱们写个if,这个if我就判断一下你的这个key啊,它等不等于什么呢?我们叫NBA,如果你的数据它等于NBA,不说别的,就是零行分区,咱们else if啊来咱们拿过来,嗯。如果呢,你是我们的什么呢?咱们写上一个K啊,它等于什么呢?我们叫wnba,那这个时候给他一个E对不对?然后呢,再来一个l if啊,放过来,放过来以后放到这边,我们写上一个K,它等不等于什么呢?我们叫CBA,那么CBA的话给他一个二,诶不就行了吗?对不对,诶咱们就是这样啊,好了,那我这样的话,我们最后呢,再给他一个什么else是吧,给他一个嗯,也给个二得了啊,就这么写吧,但这么写是不是感觉不太好,所以我们其实在skyla语言当中是不是有模式匹配啊,模式匹配的话,大家看你就可以这么写了,那咱们叫做什么呢?Key,咱们叫match,然后写个花括号,写个case,如果你是NBANBA你是不是可以直接写个零啊,然后呢,写上一个K对不对,然后写上一个咱们叫wnba,然后再写上一个一,然后再来,那这个其实大家想想是不是就可以直接给下划线了,你这么写,写个二是不就行了。
07:34
所以呀,我们的这种模式匹配跟这种判断其实逻辑上是差不多的啊,好了,那我现在就写完了呀,写完了以后,那么继续啊,同学们,咱们继续,咱们怎么去用它呢?这个时候咱们要换一种用法了,你要把你的分区器传给这个RDD,告诉他我该怎么分区,所以呢,把这个去掉,去掉以后叫做点它有个叫partition by,这个咱们之前讲过,咱们叫做my partitioner,你放过来叫做new,诶放过来,放过来以后点我们叫做VAR,诶这个就是我们分区过的那个RDD了,现在呢,把咱们的RDD的partition by,我们创建了一个我们的自定义分区器,那我接下来我为了让大家能够准确的看出来它的效果,所以我们的。
08:25
Partition r点我们用分区咱们的文件保存的方式来看看它的实际效果来,现在呢,我们就来直接运行了,同学们,好了,同学们,我们现在呢,已经得到了结果,那好,我们现在呢,打开,打开以后咱们现在有三个分区,没有任何问题吧,然后打开我们说过了,我们的NBA是不是在零号分局打开,两个NBA都在里面吧,第二个是wnba没问题吧,第三个是我们的CBA,这个不就是按照我们自定义的规则来把数据放在了不同的分区里面,对不对?诶就是这个意思啊。
我来说两句