rdd.collect()。toMap to rdd.collectAsMap()之间的区别?

时间:2015-10-20 09:39:58

标签: scala apache-spark distributed-computing

当我在RDD而不是rdd.collect()。toMap上使用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)

2 个答案:

答案 0 :(得分:4)

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调用了collect

答案 1 :(得分:2)

没有区别。避免尽可能多地使用collect(),因为它会破坏并行性的概念并收集驱动程序上的数据。