【问题标题】:Scala, Spark: find element-wise average of N mapsScala,Spark:找到 N 个映射的元素平均值
【发布时间】:2018-01-13 14:28:09
【问题描述】:

我有 N 个映射 (Map[String, Double]),每个映射具有相同的一组键。让我们这样说:

map1 = ("elem1": 2.0, "elem2": 4.0, "elem3": 3.0)

map2 = ("elem1": 4.0, "elem2": 1.0, "elem3": 1.0)

map3 = ("elem1": 3.0, "elem2": 10.0, "elem3": 2.0)

我需要返回一个新地图,其中包含这些输入地图的元素平均值:

resultMap = ("elem1": 3.0, "elem2": 5.0, "elem3": 2.0)

在 scala 中最干净的方法是什么?最好不要使用额外的外部库。

这一切都发生在 Spark* 中。因此,任何暗示特定火花使用的答案都可能会有所帮助。

【问题讨论】:

    标签: scala apache-spark reduce


    【解决方案1】:

    一种选择是将所有 Map 转换为 Seq,将它们合并为单个 Seq,按键分组并取值的平均值:

    val maps = Seq(map1, map2, map3)
    
    maps.map(_.toSeq).reduce(_++_).groupBy(_._1).mapValues(x => x.map(_._2).sum/x.length)
    
    // res6: scala.collection.immutable.Map[String,Double] = Map(elem1 -> 3.0, elem3 -> 2.0, elem2 -> 5.0)
    

    【讨论】:

      【解决方案2】:

      由于您的问题被标记为 apache-spark,您可以通过将地图组合到 RDD[Map[String, Double]] as 中来获得所需的输出

      scala>     val rdd = sc.parallelize(Seq(Map("elem1"-> 2.0, "elem2"-> 4.0, "elem3"-> 3.0),Map("elem1"-> 4.0, "elem2"-> 1.0, "elem3"-> 1.0),Map("elem1"-> 3.0, "elem2"-> 10.0, "elem3"-> 2.0)))
      rdd: org.apache.spark.rdd.RDD[scala.collection.immutable.Map[String,Double]] = ParallelCollectionRDD[1] at parallelize at <console>:24
      

      然后您可以使用flatMapmaps 的条目展平单独的行 并使用groupBy 函数和sum 分组值devide 它与分组映射的大小。你应该得到你想要的输出为

      scala> rdd.flatMap(row => row).groupBy(kv => kv._1).mapValues(values => values.map(value => value._2).sum/values.size)
      res0: org.apache.spark.rdd.RDD[(String, Double)] = MapPartitionsRDD[5] at mapValues at <console>:27
      
      scala> res0.foreach(println)
      [Stage 0:>                                                          (0 + 0) / 4](elem2,5.0)
      (elem3,2.0)
      (elem1,3.0)
      

      希望回答对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多