键值对 RDD 是 Spark 中许多操作所需要的常见数据类型。 本章做特别讲解。除了在基础RDD类中定义的操作之外,Spark 为包含键值对类型的 RDD 提供了一些专有的操作 在PairRDDFunctions专门进行了定义。这些 RDD 被称为 pair RDD。RDD当中非常常见的PairRDD,也叫做键值对RDD,可以理解成KVRDD。
有很多种方式创建pair RDD,在输入输出章节会讲解。一般如果从一个普通的RDD转 为pair RDD时,可以调用map()函数来实现,传递的函数需要返回键值对。
val pairs = lines.map(x => (x.split(" ")(0), x))
1、键值对RDD的转化操作
(1)转化操作列表
(2)聚合操作
当数据集以键值对形式组织的时候,聚合具有相同键的元素进行一些统计操作,如:fold()、combine()、reduce()https://www.jianshu.com/p/15739e95a46e(介绍)等行动操作,pairRDD则有相应的针对键的转化操作,spark中可以组合具有相同键的值,这些操作返回RDD是转化操作。
reduce和fold类似,就是fold需要传一个初始值。
reduceByKey()和reduce()类似:他们都接收一个函数,并使用该函数对值进行合并。reduceByKey()会为数据集中的每个键进行并行的规约操作,每个规约操作会将键相同的值合起来。因为数据集中可能有大量的键,所以reduceByKey()没有被实现为向用户程序返回一个值得行动操作。实际上,它会返回一个由各键和对应键规约出来的结果值组成新的RDD。
reduceByKey比groupByKey效率高,因为reduceByKey会进行预聚合。
reduceByKey是转化算子,reduce是执行算子。
foldByKey()则与fold相当类似:它们都是使用一个与RDD和合并函数中的数据类型相同的零值作为初始值。与fold()一样,foldByKey()操作所使用的合并函数对零值与另一个元素进行合并,结果仍为该元素(就是零与任何集合相加都不变)。
1.关于foldByKey的数值初始化:
package chapter2
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Demo {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setAppName("demo").setMaster("local[*]")
val sc = new SparkContext(conf)
sc.setLogLevel("WARN")
//foldByKey:分组求和
val rdd = sc.makeRDD(Array(("a",1),("a",5),("b",2),("c",3),("a",3),("b",5),("c",1),("c",3),("a",5),("a",5)),3)
//看每个分区都保留了那些元素
//两个方法的共同点在于(foreach和map):都是用于遍历集合对象,并对每一项执行指定的方法。
//而两者的差异在于:foreach无返回值&#x