00:00
好了,同学们,我们接下来来学习这个叫键值类型的数据的操作啊,它会有不同的方法了,嗯,咱们叫K类型对吧?呃,那我们首先来看第一个啊,第一个叫part by啊partan这个什么意思呢?从字面函义来讲,这个叫通过什么什么,然后这个partition叫分区,那么从字面函义上来讲,好像就叫做根据或者说通过什么什么来指定分区的意思,对不对?所以我们这个呢,给大家看一看啊,来把这个关掉,关掉以后呢,我们拷贝,然后呢,写上一个我们的14啊。好,点击OK啊,然后呢放过来,然后我们接下来把这个呢写上啊,咱们叫KV类型啊,咱们叫KV类型K,然后呢,写上一个V类型啊好把这个地方呢,我们都给它去掉,不要了,嗯,那么接下来我们就写上咱们的RDDRDD,咱们的c.make r DD啊好了,呃,写完之后,然后写上一个1234OK,那么接下来干嘛呢?我们RDD点我们叫partition by。
01:11
大家有没有发现我这个地方好像根本就没有那个方法呀,咱们叫partition啊,咱们叫partition by,有没有发现根本就没有这个方法,诶老师你这个课件是不是写错了呀?你说叫什么partan by,我这没看到啊,对不对?这是什么意思?给大家解释一下啊,我们的partition by它的这个方法他说了叫KV类型,那么什么叫K类型啊?它指的就是说你的数据不能是单一的值了,应该是特定的类型,叫键值类型。可是我们会发现同学们看我们这个地方诶。是吗?它不是,那那怎么办?那所以啊,在之前我们应该写上咱们叫做Val,叫map r DD,把它的结构发生点变化,所以点map,然后写个下划线逗号一,你这么写了以后,那现在的这个地方诶就可以partition by了,对不对,然后你加一个括号诶就可以了,诶老师为什么我这么写了以后就可以了呢?因为你把这个数据的类型从int类型变成了一个tale类型,而这个tale呢,是一个对偶原组,就形成了建制类型,就可以使用了啊那到底怎么回事呢?我们来再点这个partan by,大家看一下点点完以后,你有没有发现我们的这个方法是谁提供的?
02:40
是我们这个叫r DD function这样的一个类提供的,对不对。所以啊,它不是我们的RDD了,你不感觉很奇怪吗?就意味着我们现在调用的这个方法,其实它不是RDD的,它是另外的一个类中的方法,那这个就不太明白了,我们RDD,哎,大家看我们现在就变成了这个样子,所以来拿过来。
03:07
好,反过来这是本身呀,咱们是RDD,但是呢,我现在调的就是他的方法,那他俩有没有什么关系呢?我看一看啊,好像这个也跟没有什么继承RDB之类的吧,所以好像跟RDB没有什么关系,那没有什么关系,你的质量怎么能这么用呢,对不对。而且大家看看啊,我们为了让大家看的方便,我们这写个冒号叫RDD,写成一个咱们叫tale,写成一个int啊,咱们叫做int,然后这个也叫int。大家想想没问题吧,所以它是不是RDD,它如果是RDD的话,这个方法按理说应该是RDD的方法,但是我们说了不是,那这个肯定我相信同学们应该能够有印象吧,咱们史该语法当中有一个特定的处理,咱们称之为叫隐式转换,有印象吗?同学们咱们叫隐式转换啊来,嗯。
04:01
咱们叫隐私转换,它当我们的程序编译出现错误的时候,它会尝试着在整个的作用域范围之内去查找咱们的转换规则,看一看能不能够把它转换成特定的类型之后让它编译通过。所以隐私转换我们简单的可以理解为咱们叫二次编译啊,二次编译就是你第一回编译的时候啊,发现呢编译不过,所谓的编译不过呢,就是因为它没有这样的方法,对不对?但是呢,如果我找到哎,我们在作用域范围之内的一个特定的转换规则,让它可以编译通过,那这种操作就非常的好了。诶,那这个是怎么做到的呢?它怎么就能够把RDD变成我们的派RDD方程式呢?其实呀,咱们拷贝啊,来拷贝,拷贝以后点击RDD点点完以后咱们搜索一下,搜索以后咱们往下走,往下走往下走,往下走以后同学们,咱们接着往下,接着往下走,到这个地方的时候,你是不是发现了,在咱们当前RDD里面,其实它会有一个什么伴生对象,伴生对象里面会有一个方法,这个方法的名字就叫r DD two。
05:13
RDD式,它会把咱们这样的RDD就变成RDD,它前面加了一个关键字叫implicit,我们把这样的函数称之为叫隐式函数,还有印象吗?这个在咱们史盖LA的学习当中应该是学过的啊,它可以将一个类型变成另外一个类型来调用它的方法,这种方式呀,它遵循了咱们的OCP开发原则,是非常不错的一种方式啊。好了,那我们现在就知道了哦,原来他是通过这种方式来调用的partan by这个方法,那这个partan by它干嘛了呢?还有我们刚才说过了啊,这里我们再说另外一件事情,我们的partition by啊,它是什么呢?根据啊,咱们叫指定的分区规则,对我们的数据进行我们叫重分区。
06:09
比方说你原来同看,比方举个例子啊,比方说你现在呢,写个二,那么你的一二和三四啊,诶,他们放在两个不不同的分区里面,但是我不想那么分区,我想一和三在一个分区,我想二和四在一个分区,对不对,这样的话我处理起来方便,说的简单点,奇数在一个分区,偶数在一个分区,这是我预想的啊。可是。刚开始不是这样的,刚开始是按照均衡的方式,一和二在一个分区,三和四在一个分区,所以这样的话不满足我的要求,我要根据我指定的规则对我的数据进行重分区,记住这个重分区要跟之前咱们讲过的那个和那个re partition要区分开,因为那个呀和那个reition它只是分区数量的大小,比方说从三个变成两个,从五个变成八个,这是分区量的改变,而我们这个partition by,它所描述的概念是什么?
07:05
是什么呀,同学们。他是把我们的数据来改变它所在的位置,对不对,这是两回事儿不一样啊,诶老师,那这个规则我们该怎么写呢?其实告诉大家,我们的Spark默认就提供了一个叫哈西partitioner,所以我们拷贝,拷贝以后我们放过来,嗯。你把它放过来,放到这个地方啊,这个我们叫哈希partitioner啊,给它来加上,呃,我们给它来加上,加上了以后它需要传一个数量,比方说你的这地方不是我们的R吗?哎,我也给它个R好了,然后呢,我们再来,我写上一个什么呢点,我们叫做save,咱们叫at text file,咱们叫output,嗯。好了,那我现在试一试吧,同学们,嗯。我把这个呢,Output呢给它删掉,然后呢,我重新来执行,观察一下我们输出的效果是什么样子的啊。
08:11
嗯,好了,同学们,现在结果已经出来了,咱们就可以看一看了啊,咱们打开。打开以后大家可以看到分区变了吗?分区没有变对不对,还是两个,哎,就说明啊,我们变是这样的,然后呢,我们打开,记住原来是一二在一个分区,三四在一个分区,我打开打开以后大家会发现怎么了,你会发现咱们二和四在一个分区,然后呢,我们的一和三在一个分区对不对,后面那个一啊是因为我们在之前为了能够调这个方法,把它变成了一个键值类型的数据,对不对,但是你会发现我们的二和四放一个,我们的一和三放一个对不对,诶就是这样的,诶那这个到底是怎么实现的,它的分区规则是什么样子呢?其实大家看一下,我们点一下看看它的原理,我们点击这个叫哈西partitioner点一下,点完以后你会发现它其实继承了叫partitioner,叫继承了分区弃一个对象。
09:09
然后呢,我们有两个方法,一个叫partition,叫获取分区的数量,还有一个叫get partition叫做获取分区的号码,为什么是号码呢?因为它返回的是int啊,咱们称之为叫分区号,或者叫分区索引,它是从零开始的,就是当我们给一个数据的key过来,我会得到它所在的分区的号,然后呢,把数据就放在指定的分区里面就可以了啊。那么好,咱们回过头来看这个位置,大家看,如果你的这个K它是一个nu,那么它永远放在零号分区对不对?诶第一个分区,然后呢,如果是其他情况,他在这个地方会把哈希扣的,得到那个key的哈希扣的,然后呢,跟那个分区的数量咱们点一下,点完以后你会发现它是一个模运算啊,取它的余数对不对,所以啊,这就是它底层的一个基本的实现方式啊,这个咱们了解一下就行了,最起码你能够知道我们的数据,想要改变它所在的位置,这是没有问题的啊。
我来说两句