collectAsMap、countByKey、fold、lookup、saveAsSequenceFile
当然键值对RDD可以使用所有RDD行动算子,介绍详见:https://blog.csdn.net/qq_23146763/article/details/101013861
将结果以映射表的形式返回,以便查询
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()
}
}
对每个键对应的元素分别计数
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()
}
}
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()
}
}
返回给定键对应的所有值
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()
}
}
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()
}
}