rdd.collect().toMap 与 rdd.collectAsMap() 之间的区别?
difference between rdd.collect().toMap to rdd.collectAsMap()?
当我在我的 RDD 上使用 collectAsMap 而不是 rdd.collect().toMap 时,对性能有什么影响吗?
我有一个键值 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)
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
。
没有区别。尽可能避免使用 collect(),因为它会破坏并行概念并在驱动程序上收集数据。
当我在我的 RDD 上使用 collectAsMap 而不是 rdd.collect().toMap 时,对性能有什么影响吗?
我有一个键值 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)
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
。
没有区别。尽可能避免使用 collect(),因为它会破坏并行概念并在驱动程序上收集数据。