Scala 如何在制作物品地图时减少Spark的洗牌和花费的时间?
我正在使用spark读取如下csv文件:Scala 如何在制作物品地图时减少Spark的洗牌和花费的时间?,scala,apache-spark,apache-spark-mllib,Scala,Apache Spark,Apache Spark Mllib,我正在使用spark读取如下csv文件: x, y, z x, y x x, y, c, f x, z 我想做一张物品与数量的对比图。这是我写的代码: private def genItemMap[Item: ClassTag](data: RDD[Array[Item]], partitioner: HashPartitioner): mutable.Map[Item, Long] = { val immutableFreqItemsMap = data.flatMap(t
x, y, z
x, y
x
x, y, c, f
x, z
我想做一张物品与数量的对比图。这是我写的代码:
private def genItemMap[Item: ClassTag](data: RDD[Array[Item]], partitioner: HashPartitioner): mutable.Map[Item, Long] = {
val immutableFreqItemsMap = data.flatMap(t => t)
.map(v => (v, 1L))
.reduceByKey(partitioner, _ + _)
.collectAsMap()
val freqItemsMap = mutable.Map(immutableFreqItemsMap.toSeq: _*)
freqItemsMap
}
当我运行它时,它会占用大量的时间和空间。有没有办法缩短时间
我有一个2节点集群,每个集群有2个核心和8个分区。csv文件中的行数为170000
如果你只想做一个独特的项目计数的事情,那么我想你可以采取以下方法
val data: RDD[Array[Item]] = ???
val itemFrequency = data
.flatMap(arr =>
arr.map(item => (item, 1))
)
.reduceByKey(_ + _)
减少时不要提供任何分区,否则会导致重新洗牌。只需保留它已有的分区即可
还有。。。不要
将分布式数据收集到本地内存对象中,如映射
问题在于收集映射
。所有collect
操作都会在一个执行器上对所有元素进行内存内收集,该执行器会再次传输所有数据。处理真实数据时,应完全删除所有收集操作