Spark之核心---RDDs(2)

前言

在第一章,已經介紹過了RDDs的基本概念,創建方法和特性。那麼在本章將介紹RDD的基本操作方法。如果沒看過第一篇的點擊鏈接:Spark之核心—RDDs(1)

RDD基本操作方法之Transformation

顧名思義,Transformation時轉換的意思,在RDD中的含義就是從之前的RDD構建一個新的RDD,像map(),filter()等。下面將具體介紹這些操作方法:

  • map():想必熟悉編程的朋友對這個函數並不陌生,是映射的意思,生成的結果將是一個鍵值對。舉個例子val lines2 = lines.map(word => (word,1))
    其中:
scala> val lines = sc.textFile("../testfile/test")
scala> lines.foreach(println)
Hello Spark!
I love xyj!
I love zyh! 
Hello World!

lines的內容如上所示,lines2是對lines這個RDD的操作結果的一個新RDD,我們來看一下結果:

scala> lines2.foreach(println)
(I love xyj!,1)
(I love zyh! ,1)
(Hello Spark!,1)
(Hello World!,1)
即把行數據映射成鍵值對的形式,由於沒有split分詞,所以每行就當作一個單詞吧。
  • filter():返回值包含滿足filter函數元素的新RDD,在前一篇已經應用過。
  • flatmap():對每個輸入元素,輸出多個輸出元素,將所有的存在一個數組中。更形象的理解爲將多個RDD壓扁的意思,返回一個新的RDD。例如:[1,2,3,4],[5,6,7,8],flatmap的結果爲:[1,2,3,4,5,6,7,8]
  • 集合運算包括去重,交併集,等各種操作

RDD基本操作方法之Action

Action:最終計算出一個結果,形式如count(),save,driver program或者存在文件系統中。

  • reduce():累加,計數,其他類型的聚集操作。
    例如:
val rdd = sc.parallelize(Array(1,2,3,3))
rdd.reduce((x,y) => x+y)
結果爲: 1+2+3+3 = 10
  • collect():遍歷整個RDD,向driver pogram返回RDD的內容。不過利用collect的時候要注意內存問題,當數據量不是很大時,利用collect可以,但是有大量數據容量超過內存時,就要利用saveAsTextFile()等action操作。
  • take (n):返回RDD的n個元素(同時嘗試訪問最少的分區),是隨機無序的。
  • top():比較器
  • foreach():輸出RDD內容,不返回到本地,配合print或者其他輸出函數打印出數據,方便測試使用。

key-value對型RDDs的操作

由於key-value型的RDD在spark中應用廣泛,所以這部分單獨拿出來總結一下。

  • 創建:利用map()函數創建。
  • 操作:
    1.combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner):遍歷所有的分區(partitions),如果是新的key值,就調用createCombiner,如果已經遍歷過這個key值,就調用vergeValue,之後再合計整合每個分區得到的結果彙總mergeCombiners。這個函數是最爲常見的基於key的聚合函數,返回類型可以與輸入類型不一樣。下面舉個例子,求兩個人的成績總和:
(jake,80.0)
(jake,90.0)
(jake,85.0)
(mike,85.0)
(mike,92.0)
(mike,90.0)

 以上是原始數據,下面定義函數:
 combineByKey( score => (1,score); (c1: (Int,Double), newScore) => (c1._1,c1._2+newScore)); (c1:(Int,Double), c2:(Int,Double) => (c1._1+c2._1,c1._2+c2._2))
 其中scorevalue值,(1,score)中的1表示第一次出現,記爲1.Int表示幾門課。

2.reduceByKey(func)

eg:{(1,2),(3,4),(3,6)}
rdd.reduceByKey((x,y) => x+y)得到結果:
{(1,2),(3,10)}

3.groupByKey():相同key的分到一個組。
4.mapValues(func):對每個key中的每個value值進行相同操作。
5.flatMapValues:符號化的時候使用。
6.keys(),values()返回key和value值。
7.sortByKey():按照key排序返回RDD

發佈了45 篇原創文章 · 獲贊 29 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章