2015-10-20 6 views
7

C'è qualche impatto sulle prestazioni quando uso collectAsMap sul mio RDD invece di rdd.collect(). InMap?differenza tra rdd.collect(). ToMap in rdd.collectAsMap()?

Ho un valore chiave rdd e voglio convertire in HashMap per quanto so che collect() non è efficiente su insiemi di dati di grandi dimensioni in quanto viene eseguito su driver posso utilizzare collectAsMap invece c'è qualche impatto sulle prestazioni?

originale:

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

Cambio:

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

Nessuna differenza di prestazioni significativa. 'collectAsMap' semplicemente raccoglie' RDD' e crea un 'HashMap' mutabile su un driver. – zero323

+0

esiste un modo per creare hashmap utilizzando le best practice? senza usare collectAsMap o collect(). toMap? –

+0

Se si prevedono chiavi duplicate, è possibile ridurre la quantità di dati trasferiti al driver rimuovendo prima i duplicati, altrimenti è altrettanto buono. – zero323

risposta

2

L'attuazione del collectAsMap è la seguente

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 
    } 

Quindi, non v'è alcuna differenza di prestazioni tra collect e collectAsMap, perché collectAsMap chiama unde r la cappa anche collect.

1

Nessuna differenza. Evita di usare collect() il più possibile in quanto distrugge il concetto di parallelismo e raccoglie i dati sul driver.