如何将 Iterable[String] 分组为(键,出现次数)元组

Posted

技术标签:

【中文标题】如何将 Iterable[String] 分组为(键,出现次数)元组【英文标题】:How to group Iterable[String] into (key, no of occurrences) tuple 【发布时间】:2020-03-08 20:06:41 【问题描述】:

我是 spark 和 scala 的新手,我正在尝试

我有 (presentation,CompactBuffer(3, 3, 24, 24, 24, 24, 24, 28, 28, 28)) 形式的 RDD 我正在尝试转换为 (presentation, List((3,2),(24,5),(28,3))

我能够转换为 (string, Iterable[String]) (演示文稿,列表((3,1),(3,1),(24,1),(24,1),(24,1),(24,1),(24,1),(28, 1), (28,1), (28,1)))。

如何将它们分组为 (3,2), (24, 3)

''' val RDD4 = RDD3.map 
      case (key, values) =>
        val v = values.map(word => (word, 1))
        (key, v)
    '''

【问题讨论】:

Spark 是用 Scala 编写的,pyspark 是用于 spark 的 Python API。 【参考方案1】:

你可以这样:

List((3,1), (3,1), (24,1), (24,1), (24,1), (24,1), (24,1), (28,1), (28,1), (28,1))
    .groupBycase (key, _) => key
    .mapValues(
      valuesWithSameKeyList => valuesWithSameKeyList
        .map 
          case (_, value) => value
        .sum
    )

【讨论】:

以上是关于如何将 Iterable[String] 分组为(键,出现次数)元组的主要内容,如果未能解决你的问题,请参考以下文章

Spark 中在处理大批量数据排序问题时,如何避免OOM

将 Iterable[Either[A,B]] 减少为 Either[A, Iterable[B]]

scala中分组的算子的用法

为啥 String.matchAll() 返回的 Iterable Object 的长度为 1?

Python中的iterable该怎么理解

Scala:无法将数组传递给需要 Seq 或 Iterable 的函数