我正在使用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 => t)
.map(v => (v, 1L))
.reduceByKey(partitioner, _ + _)
.collectAsMap()
val freqItemsMap = mutable.Map(immutableFreqItemsMap.toSeq: _*)
freqItemsMap
}
当我跑步时,它需要花费很多时间并且会改变空间。有没有办法减少时间?
我有一个2节点集群,每个集群有2个核心和8个分区。 csv文件中的行数是170000。
答案 0 :(得分:0)
如果你只是想做一个独特的项目计数,那么我想你可以采取以下方法。
val data: RDD[Array[Item]] = ???
val itemFrequency = data
.flatMap(arr =>
arr.map(item => (item, 1))
)
.reduceByKey(_ + _)
减少时不要提供任何分区,否则会导致重新洗牌。只需保留它已有的分区。
另外......不要将分布式数据collect
放入本地内存中对象,如Map
。