键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作
Spark中创建pair RDD的方法:
1、存储键值对的数据格式会在读取时直接返回由其键值对数据组成的pair RDD
2、还可以使用map()函数将一个普通的RDD转为pair RDD。
Pair RDD的转化操作
- reduceByKey() 与reduce类似 ,接收一个函数,并使用该函数对值进行合并,为每个数据集中的每个键进行并行的归约操作。返回一个由各键和对应键归约出来的结果值组成的新的RDD。例如 :上一章中单词计数的例子:val counts = words.map(word => (word,1)).reduceByKey{ case (x,y) => x + y}
- foldByKey()与fold()类似,都使用一个与RDD和合并函数中的数据类型相同的零值最为初始值。val counts = words.map(word => (word,1)).foldByKey{ case (x,y) => x + y}
- combineByKey()是最为常用的基于键进行聚合的函数,可以返回与输入类型不同的返回值。
- groupByKey()使用RDD中的键来对数据进行分组,对于一个由类型K的键和类型V的值组成的RDD,所得到的结果RDD类型会是[K, Iterable[V] ]。
- cogroup函数对多个共享同一个键的RDD进行分组,对两个键类型均为K而值类型分别为V和W的RDD进行cogroup时,得到的结果RDD类型为[(K,(Iterable[V],Iterable[W]))] 。
- join(other)这样的连接是内连接,只有在两个pair RDD中都存在的键才输出。若一个输入对应的键有多个值时,生成的pair RDD会包括来自两个输入RDD的每一组相对应的记录。
- leftOuterJoin(other)左外连接和rightOuterJoin(other)右外连接都会根据键连接两个RDD,但是允许结果中存在其中的一个pair RDD所缺失的键。
- sortByKey()函数接收一个叫做ascending的参数,表示想要让结果升序排序还是降序排序。
Pair RDD的行动操作
1、countByKey() 对每个键对应的元素分别计数。
2、collectAsMap()将结果以映射表的形式返回,注意后面的value会覆盖前面的。
3、lookup(key)返回给定键对应的所有值。