键值对RDD通常用来进行聚合计算。
一般通过一些初试ETL(抽取、转化、装载)操作来将数据转化为键值对形式。
Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD被称为pairRDD,
我们通常从一个RDD中提取某些字段(如代表事件时间、用户ID 或者其他标识符的字段),并使用这些字段作为pairRDD操作中的键。
pairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口
1. 创建pairRDD
存储键值对的数据格式中读取时直接返回由其键值对数据组成的pairRDD,
当需要把一个普通的RDD转为pairRDD时,可以调用map()函数来实现,传递的函数需要返回键值对
2. pairRDD的转化操作
可以使用所有标准RDD上的可用的转化操作
pairRDD还是RDD,如可以拿pairRDD筛选掉长度超过20个字符的行
聚合操作:
reduceByKey():和reduce()相当类似,它们都接收一个函数,并使用该函数对值进行合并。reduceByKey()可以分别归约每个键对应的数据,每个归约操作会将键相同对值合并起来。它返回一个由各键和对应键归约出来的结果值组成的新的RDD
combineByKey():最为常用的基于键进行聚合的函数,和aggregate()一样,combinByKey()可以让用户返回与输入数据的类型不同的返回值。 combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没遇到过,要么和之前的某个元素的键相同。
foldByKey():与fold()相当类似,使用一个与RDD合并函数中的数据类型相同的零值作为初始值。与fold()一样,foldByKey()操作所使用的合并函数对零值与另一个元素进行合并,结果仍为该元素。
并行度调优
repartition():改变RDD的分区,把数据通过网络进行混洗,创建出新的分区集合。(这是对数据重新分区是代价相对比较大对操作)
coalesce():优化版repartition()
Java或scala中可以使用rdd.partition.size(),Python中用rdd.getNumPartitions查看RDD的分区数,
并确保coalesce()时将RDD合并到比现在的分区数更少的分区中。
数据分组
groupByKey():使用RDD中的键来对数据进行分组,
对一个由类型K的键和类型V的值组成的RDD,得到的结果RDD类型会是[ K,Iterable[V] ]
groupBy():用于未成对的数据上,也可以根据除键相同以外的条件进行分组。它可以接收一个函数,对源RDD中的每个元素使用该函数,将返回结果作为键再进行分组。
连接
join():可以把两个RDD中键相同的元素组合到一起,合并为一个RDD
数据排序
sortByKey():接收一个叫ascending的参数,表示我们是否要让结果按照升序排序(默认为true)
pairRDD的行动操作
数据分区: