所有鍵值對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()
}
}