所有键值对RDD行动算子如下:
collectAsMap、countByKey、fold、lookup、saveAsSequenceFile
当然键值对RDD可以使用所有RDD行动算子,介绍详见:https://blog.csdn.net/qq_23146763/article/details/101013861
具体解释和例子
1. collectAsMap
将结果以映射表的形式返回,以便查询
object CollectAsMap {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("transformations examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val rdd = sc.parallelize(List(("A", 1), ("A", 2), ("C", 1), ("D", 1)))
rdd.collectAsMap().foreach(println)
sc.stop()
}
}
2. countByKey
对每个键对应的元素分别计数
object CountByKey {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("transformations examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val rdd = sc.parallelize(List(("A", 1), ("A", 2), ("B", 1), ("B", 1), ("B", 1)))
val count = rdd.countByKey()
count.foreach(println)
sc.stop()
}
}
3. fold
fold(zeroValue:T)(op:(T,T) => T):通过op函数聚合各分区中的元素及合并各分区的元素,op函数需要两个参数,在开始时第一个传入的参数为zeroValue,
T为RDD数据集的数据类型,其作用相当于SeqOp和comOp函数都相同的aggregate函数
其过程如下:
1.开始时将(“d”,0)作为op函数的第一个参数传入,将Array中和第一个元素(“a”,1)作为op函数的第二个参数传入,并比较value的值,返回value值较大的元素
2.将上一步返回的元素又作为op函数的第一个参数传入,Array的下一个元素作为op函数的第二个参数传入,比较大小
3.重复第2步骤
每个分区的数据集都会经过以上三步后汇聚后再重复以上三步得出最大值的那个元素
object Fold {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("transformations examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val rdd = sc.parallelize(Array(("a", 1), ("b", 2), ("a", 2), ("c", 5), ("a", 3)), 2)
val foldRDD = rdd.fold(("d", 0))((val1, val2) => {
if (val1._2 >= val2._2) val1 else val2
})
println(foldRDD)
sc.stop()
}
}
4. lookup
返回给定键对应的所有值
object Lookup {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("transformations examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val rdd = sc.parallelize(List(("A", 1), ("A", 2), ("C", 1), ("D", 1)))
rdd.lookup("A").foreach(println)
sc.stop()
}
}
5. saveAsSequenceFile
SequenceFile是 Hadoop 的一个重要数据文件类型,它提供key-value的存储,但与传统key-value存储(比如hash表,btree)不同的是,它是append only的,于是你不能对已存在的key进行写操作。
SaveAsSequenceFile在本地文件系统、HDFS或任何其他Hadoop支持的文件系统中,将数据集的元素作为Hadoop SequenceFile写在给定路径中。
object SaveAsSequenceFile {
def main(args: Array[String]): Unit = {
val sparkConf = new SparkConf().setAppName("transformations examples").setMaster("local[*]")
val sc = new SparkContext(sparkConf)
val rdd2 = sc.parallelize(List(("A", 1), ("A", 2), ("C", 1), ("D", 1)))
rdd2.saveAsSequenceFile("file:///github/SparkLearnExample/save_data/")
sc.stop()
}
}