当我在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)
答案 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
}
因此,collect
和collectAsMap
之间没有任何性能差异,因为collectAsMap
调用了collect
。
答案 1 :(得分:2)
没有区别。避免尽可能多地使用collect(),因为它会破坏并行性的概念并收集驱动程序上的数据。