1. 程式人生 > >spark 中map 和flatmap 的區別

spark 中map 和flatmap 的區別

需求背景:

統計相鄰兩個單詞出現的次數。

val s="A;B;C;D;B;D;C;B;D;A;E;D;C;A;B"

s: String = A;B;C;D;B;D;C;B;D;A;E;D;C;A;B

 val data=sc.parallelize(Seq(s))

data.collect()

res0: Array[String] = Array(A;B;C;D;B;D;C;B;D;A;E;D;C;A;B)                                                     

截止目前位置是一個String型別的陣列。

​​​val mapTemp=data.map(_.split(";"))

scala> mapTemp.collect

res4: Array[Array[String]] = Array(Array(A, B, C, D, B, D, C, B, D, A, E, D, C, A, B))

map操作在於處理之前和處理之後的資料型別是一致的。

​​​val mapRs=data.map(_.split(";")).map(x=>{for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1)})

mapRs.collect

res1: Array[scala.collection.immutable.IndexedSeq

[(String, Int)]] = Array(Vector((A,B,1), (B,C,1), (C,D,1), (D,B,1), (B,D,1), (D,C,1), (C,B,1), (B,D,1), (D,A,1), (A,E,1), (E,D,1), (D,C,1), (C,A,1), (A,B,1)))

val flatMapRs=data.map(_.split(";")).flatMap(x=>{for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1)})

flatMapRs.collect

res3: Array[(String, Int)] = Array((A,B,1), (B,C,1), (C,D,1), (D,B,1), (B,D,1), (D,C,1), (C,B,1), (B,D,1), (D,A,1), (A,E,1), (E,D,1), (D,C,1), (C,A,1), (A,B,1))

而flatMap會把一類集合類的資料抹平從而展示的效果是元素的方式,比如從​Vector中遍歷然後羅列出來。

val flatMap= data.map(_.split(";")).flatMap(x=>{for(i<-0 until x.length-1) yield (x(i)+","+x(i+1),1)}).reduceByKey(_+_).foreach(println)

(A,E,1)

(C,D,1)

(B,D,2)

(D,B,1)

(C,A,1)

(C,B,1)

(E,D,1)

(D,A,1)

(B,C,1)

(D,C,2)

(A,B,2)

​reduceByKey算數因子解釋:

  • Basically reduceByKey function works only for RDDs which contains key and value pairs kind of   elements(i.e RDDs having tuple or Map as a data element). It is a transformation operation   which means it is lazily evaluated.We need to pass one associative function as a parameter,   which will be applied to the source RDD and will create anew RDD as with resulting values(i.e.  key value pair). This operation is a wide operation as data shuffling may happen across the   partitions.【本質上來講,reduceByKey函式(說運算元也可以)只作用於包含key-value的RDDS上,它是  transformation型別的運算元,這也就意味著它是懶載入的(就是說不呼叫Action的方法,是不會去計算的  ),在使用時,我們需要傳遞一個相關的函式(_+_)作為引數,這個函式將會被應用到源RDD上並且建立一個新的  RDD作為返回結果,這個運算元作為data Shuffling 在分割槽的時候被廣泛使用】  

相關推薦

SparkmapflatMap區別

Map和flatMap的區別 Transformation 含義 map(func) 返回一個新的RDD,該RDD由每一個輸入元素經過func函式轉換後組成 flatMap(func) 類似於map,但是每一個輸入元素可以被對映為0或多個輸出

sparkmapflatmap之間的區別

map()是將函式用於RDD中的每個元素,將返回值構成新的RDD。 flatmap()是將函式應用於RDD中的每個元素,將返回的迭代器的所有內容構成新的RDD,這樣就得到了一個由各列表中的元素組成的RDD,而不是一個列表組成的RDD。 有些拗口,看看例子就明白了。 val

Spark學習筆記 --- SparkMapFlatMap轉換的區別

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

spark map flatmap區別

需求背景: 統計相鄰兩個單詞出現的次數。 val s="A;B;C;D;B;D;C;B;D;A;E;D;C;A;B" s: String = A;B;C;D;B;D;C;B;D;A;E;D;C;A;B  val data=sc.parallelize(Seq(s)

java8 mapflatmap的共同點區別,以及兩者的例項解析

在函式式語言中,函式作為一等公民,可以在任何地方定義,在函式內或函式外,可以作為函式的引數和返回值,可以對函式進行組合。由於指令式程式設計語言也可以通過類似函式指標的方式來實現高階函式,函式式的最主要的好處主要是不可變性帶來的。沒有可變的狀態,函式就是引用透明(Referen

SparkmapflatMap

必須 ret iter ext within serve 函數 range fail map將函數作用到數據集的每一個元素上,生成一個新的分布式的數據集(RDD)返回 map函數的源碼: def map(self, f, preservesPartitioning=Fal

sparkmap與mapPartitions區別

part print map spark 偽代碼 一個 數據 最終 partition 在spark中,map與mapPartitions兩個函數都是比較常用,這裏使用代碼來解釋一下兩者區別 import org.apache.spark.{SparkConf, Spar

Spark mapflatMap 的比較

通過一個實驗來看Spark 中 map 與 flatMap 的區別。   步驟一:將測試資料放到hdfs上面 hadoopdfs -put data1/test1.txt /tmp/test1.txt 該測試資料有兩行文字:   步驟二:在Spark

Rxjava mapflatMap區別

map和flatMap都是依賴傳入的Function對資料進行變換 但是 1、返回值上面: map變換後可以返回任意值,而flatMap則只能返回ObservableSource型別 2、變換後的輸出: map只能進行一對一的變換,而flatMap則可以進行一對一,

JDK8lambda表示式之mapFlatMap區別

import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; import java.ut

JavaScriptMapForEach的區別

get 新的 create line 速度對比 圖片 技術分享 其中 原來 譯者按: 慣用Haskell的我更愛map。 原文: JavaScript?—?Map vs. ForEach - What’s the difference between Map and Fo

java8stream的mapflatmap的理解

ext 解法 -s char 個數 c89 ros slist https 轉自https://blog.csdn.net/wynjauu/article/details/78741093 假如我們有這樣一個需求給定單詞列表["Hello","World"],你想要返

SparkrepartitionpartitionBy的區別

是我 item its alt ive 同時 tint nts exe repartition 和 partitionBy 都是對數據進行重新分區,默認都是使用 HashPartitioner,區別在於partitionBy 只能用於 PairRDD,但是當它們同時都用於

spark mapmapPartitions區別

主要區別: map是對rdd中的每一個元素進行操作; mapPartitions則是對rdd中的每個分割槽的迭代器進行操作 MapPartitions的優點: 如果是普通的map,比如一個partition中有1萬條資料。ok,那麼你的function要執行和計算1萬次。 使用M

C++ STLmapunordered_map的區別

map與unordered_map對比 map unordered_map 紅黑樹(屬於非嚴格二叉平衡搜尋樹)實現 雜湊表實現 有序 無序 —— 查詢時間複雜度為O(1

Spark之中mapflatMap區別

一直不太明白spark之中map與flatMap之間的區別。map的作用很容易理解就是對rdd之中的元素進行逐一進行函式操作對映為另外一個rdd。flatMap的操作是將函式應用於rdd之中的每一個元素,將返回的迭代器的所有內容構成新的rdd。通常用來切分單詞。 區別1: flatM

javascriptmapfilter的區別

原生js中陣列可以直接通過map(),filter()函式來進行一次操作,他們分別是做一次統一對映,和一次過濾。說的更通俗一點,就是map函式之後,陣列元素個數不變,但是按照一定的條件轉換,陣列元素髮生了變化。filter函式之後,陣列元素個數可能發生了改變,但是陣列元素不會發生改變。 下面

C++mapset的使用與區別

set set是一種關聯式容器,其特性如下: set以RBTree作為底層容器 所得元素的只有key沒有value,value就是key 不允許出現鍵值重複 所有的元素都會被自動排序 不能通過迭代器來改變set的值,因為set的值就是鍵 針對這五點來說,

sparkmakerddparallelize的區別

我們知道,在Spark中建立RDD的建立方式大概可以分為三種:(1)、從集合中建立RDD;(2)、從外部儲存建立RDD;(3)、從其他RDD建立。   而從集合中建立RDD,Spark主要提供了兩中函式:parallelize和makeRDD。我們可以先看看這兩個函式的宣告

【Big Data 每日一題20180821】Sparkmlmllib的區別

Spark中ml和mllib的主要區別和聯絡如下: ml和mllib都是Spark中的機器學習庫,目前常用的機器學習功能2個庫都能滿足需求。 spark官方推薦使用ml, 因為ml功能更全面更靈活,未來會主要支援ml,mllib很有可能會被廢棄(據說可能是在spark3.