如何在制作物品地图时减少Spark的洗牌和时间?

时间:2017-02-09 12:55:13

标签: 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 => t)
      .map(v => (v, 1L))
      .reduceByKey(partitioner, _ + _)
      .collectAsMap()

    val freqItemsMap = mutable.Map(immutableFreqItemsMap.toSeq: _*)
    freqItemsMap
  }

当我跑步时,它需要花费很多时间并且会改变空间。有没有办法减少时间?

  

我有一个2节点集群,每个集群有2个核心和8个分区。 csv文件中的行数是170000。

1 个答案:

答案 0 :(得分:0)

如果你只是想做一个独特的项目计数,那么我想你可以采取以下方法。

val data: RDD[Array[Item]] = ???

val itemFrequency = data
  .flatMap(arr =>
    arr.map(item => (item, 1))
  )
  .reduceByKey(_ + _)

减少时不要提供任何分区,否则会导致重新洗牌。只需保留它已有的分区。

另外......不要将分布式数据collect放入本地内存中对象,如Map