【问题标题】:Scala Pairs: how to count the number of the ocurrences in the value (list of numbers) [duplicate]Scala Pairs:如何计算值中出现的次数(数字列表)[重复]
【发布时间】:2019-03-09 17:32:21
【问题描述】:

我有一个 RDD[(Int, ListBuffer[Byte])] 并且我喜欢执行“wordcount”,但对于列表中的每个数字。 例如,RDD 是:

(31000,ListBuffer(1, 1, 0, 1, 0, 1, 1, 1, 1))
(21010,ListBuffer(0, 0, 0))
(23000,ListBuffer(1, 1, 1, 1, 1))
(01000,ListBuffer(1, 1))
(34000,ListBuffer(0))

我想得到这个:

(31000,(0,2),(1,7)) // this could be a Map[0=>2, 1=>7]
(21010,(0,3))
(23000,(1,5))
(01000,(1,2))
(34000,(0,3))

有什么指导吗?提前谢谢你

编辑:有人建议我的问题是重复的,但问题是建议的帖子只是一个列表,但我想申请一个 Pair (Int, List)。

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    在 Scala 集合中获取值的直方图最惯用的方法是使用 groupBy 后跟一个获取每个结果组大小的映射:

    scala> import collection.mutable.ListBuffer
    import collection.mutable.ListBuffer
    
    scala> val values = ListBuffer(1, 1, 0, 1, 0, 1, 1, 1, 1)
    values: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 1, 0, 1, 0, 1, 1, 1, 1)
    
    scala> values.groupBy(identity).mapValues(_.size)
    res0: scala.collection.immutable.Map[Int,Int] = Map(1 -> 7, 0 -> 2)
    

    在您的情况下,该部分完全独立于 Spark 部分——您只是碰巧对 RDD 中的值执行此操作,但完整的解决方案如下所示:

    scala> val counts = myRdd.mapValues(_.groupBy(identity).mapValues(_.size))
    counts: org.apache.spark.rdd.RDD[(Int, scala.collection.immutable.Map[Int,Int])] = MapPartitionsRDD[1] at mapValues at <console>:26
    
    scala> counts.foreach(println)
    (1000,Map(1 -> 2))
    (21010,Map(0 -> 3))
    (23000,Map(1 -> 5))
    (34000,Map(0 -> 1))
    (31000,Map(1 -> 7, 0 -> 2))
    

    值得注意的是,Scala 集合上的 mapValues 是惰性的,这意味着每次在 RDD 中使用映射时,都会重新计算值。这可能没问题,但是如果您担心,可以将其替换为以下内容:

    values.groupBy(identity).map { case (k, v) => k -> v.size }
    

    ...这将返回一个经过严格评估的地图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-12
      • 2016-09-23
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 2018-11-15
      • 2021-02-05
      相关资源
      最近更新 更多