2015-10-20 51 views
7

當我在RDD上使用collectAsMap而不是rdd.collect().toMap時,是否會影響性能?rdd.collect().toMap和rdd.collectAsMap()之間的區別?

我有一個鍵值rdd,我想轉換爲HashMap,據我所知collect()在大數據集上效率不高,因爲它在驅動程序上運行,我可以使用collectAsMap而不是有任何性能影響?

原文:

val QuoteHashMap=QuoteRDD.collect().toMap 
val QuoteRDDData=QuoteHashMap.values.toSeq 
val QuoteRDDSet=sc.parallelize(QuoteRDDData.map(x => x.toString.replace("(","").replace(")",""))) 
QuoteRDDSet.saveAsTextFile(Quotepath) 

變化:

val QuoteHashMap=QuoteRDD.collectAsMap() 
val QuoteRDDData=QuoteHashMap.values.toSeq 
val QuoteRDDSet=sc.parallelize(QuoteRDDData.map(x => x.toString.replace("(","").replace(")",""))) 
QuoteRDDSet.saveAsTextFile(Quotepath) 
+1

沒有顯着的性能差異。 'collectAsMap'僅收集'RDD'並在驅動程序上創建一個可變的'HashMap'。 – zero323

+0

有沒有一種方法可以使用最佳實踐來創建hashmap?而不使用collectAsMap或collect().toMap? –

+0

如果您希望重複密鑰,您可以通過首先刪除重複數據來減少傳輸到驅動程序的數據量,否則它會達到最佳效果。 – zero323

回答

2

collectAsMap實現如下

def collectAsMap(): Map[K, V] = self.withScope { 
    val data = self.collect() 
    val map = new mutable.HashMap[K, V] 
    map.sizeHint(data.length) 
    data.foreach { pair => map.put(pair._1, pair._2) } 
    map 
    } 

因此,collectcollectAsMap之間不存在性能差異,因爲collectAsMap調用unde引擎蓋也collect

1

沒有區別。儘可能避免使用collect(),因爲它會破壞並行性的概念並收集驅動程序中的數據。