Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 减少Spark中每个分区的哈希映射_Scala_Apache Spark_Hashmap_Partition - Fatal编程技术网

Scala 减少Spark中每个分区的哈希映射

Scala 减少Spark中每个分区的哈希映射,scala,apache-spark,hashmap,partition,Scala,Apache Spark,Hashmap,Partition,我有一个RDD的一些mutable.Map[(Int,Array[Double])],我想通过Int来减少映射,并找到数组元素的方法 例如,我有: Map[(1, Array[0.1, 0.1]), (2, Array[0.3, 0.2])] Map[(1, Array[0.1, 0.4])] 我想要的是: Map[(1, Array[0.1, 0.25]), (2, Array[0.3, 0.2])] 问题是,我不知道reduce如何在地图之间工作,此外,我还必须在每个分区中执行此操作,

我有一个
RDD
的一些
mutable.Map[(Int,Array[Double])]
,我想通过
Int
来减少映射,并找到数组元素的方法

例如,我有:

Map[(1, Array[0.1, 0.1]), (2, Array[0.3, 0.2])] 
Map[(1, Array[0.1, 0.4])]
我想要的是:

Map[(1, Array[0.1, 0.25]), (2, Array[0.3, 0.2])]
问题是,我不知道
reduce
如何在地图之间工作,此外,我还必须在每个分区中执行此操作,将结果收集到驱动程序中,并在那里进行简化。我找到了
foreachPartition
方法,但我不知道它是否用于这种情况


有什么想法吗?

您可以使用
combineByKey

val rdd = ss.sparkContext.parallelize(Seq(
  Map((1, Array(0.1, 0.1)), (2, Array(0.3, 0.2))),
  Map((1, Array(0.1, 0.4)))
))

// functions for combineByKey
val create = (arr: Array[Double]) => arr.map( x => (x,1))
val update = (acc : Array[(Double,Int)], current: Array[Double]) => acc.zip(current).map{case ((s,c),x) => (s+x,c+1)}
val merge =  (acc1 : Array[(Double,Int)],acc2:Array[(Double,Int)]) => acc1.zip(acc2).map{case ((s1,c1),(s2,c2)) => (s1+s2,c1+c2)}

val finalMap = rdd.flatMap(_.toList)
  // aggreate elementwise sum & count
  .combineByKey(create,update,merge)
  // calculate elementwise average per key
  .map{case (id,arr) => (id,arr.map{case (s,c) => s/c})}
  .collectAsMap()

// finalMap = Map(2 -> Array(0.3, 0.2), 1 -> Array(0.1, 0.25))