今天是spark专题的第四篇文章,我们一起来看下Pair RDD。
定义
在之前的文章当中,我们已经熟悉了RDD的相关概念,也了解了RDD基本的转化操作和行动操作。今天我们来看一下RDD当中非常常见的PairRDD,也叫做键值对RDD,可以理解成KVRDD。
KV很好理解,就是key和value的组合,比如Python当中的dict或者是C++以及Java当中的map中的基本元素都是键值对。相比于之前基本的RDD,pariRDD可以支持更多的操作,相对来说更加灵活,可以完成更加复杂的功能。比如我们可以根据key进行聚合,或者是计算交集等。
所以本身pairRDD只不过是数据类型是KV结构的RDD而已,并没有太多的内涵,大家不需要担心。
Pair RDD转化操作
Pair RDD也是RDD,所以之前介绍的RDD的转化操作Pair RDD自然也可以使用。它们两者有些像是类继承的关系,RDD是父类,Pair RDD是实现了一些新特性的子类。子类可以调用父类当中所有的方法,但是父类却不能调用子类中的方法。
调用的时候需要注意,由于我们的Pair RDD中的数据格式是KV的二元组,所以我们传入的函数必须是针对二元组数据的,不然的话可能运算的结果会有问题。下面我们来列举一些最常用的转化操作。
为了方便演示,我们用一个固定的RDD来运行各种转化操作,来直观了解一下这些转化操作究竟起什么样的作用。
ex1 = sc.parallelize([[1, 2], [3, 4], [3, 5]])
复制代码
keys,values和sortByKey
这三个转化操作应该是最常用也是最简单的,简单到我们通过字面意思就可以猜出它们的意思。
我们先来看keys和values:
我们的RDD当中二元组当中的第一个元素会被当做key,第二个元素当做value,需要注意的是,它并不是一个map或者是dict,所以key和value都是可以重复的。
sortByKey也很直观,我们从字面意思就看得出来是对RDD当中的数据根据key值进行排序,同样,我们也来看下结果:
mapValues和flatMapValues
ma