Spack [Scala]:按键减少嵌套元组值

Posted

技术标签:

【中文标题】Spack [Scala]:按键减少嵌套元组值【英文标题】:Spack [Scala]: Reduce a nested tuple value by key 【发布时间】:2020-09-17 11:25:46 【问题描述】:

假设我有一个 Spark Scala 程序,其 RDD 名为 mention_rdd,如下所示:

(name, (filename, sum))
...
(Maria, (file0, 3))
(John, (file0, 1))
(Maria, (file1, 6))
(Maria, (file2, 1))
(John, (file2, 3))
...

我们有文件名和每个名称的出现次数。

我想为每个名称减少并找到出现次数最多的文件名。例如:

(name, (filename, max(sum))
...
(Maria, (file1, 6))
(John, (file2, 3))
...

我尝试自己访问 RDD 的 (filename,sum) 元组,所以我可以从那里减少 name(由于错误说我无法从 mention_rdd 遍历,因为 (String,Int)不是TraversableOnce 类型):

val output = mention_rdd.flatMap(file_counts => file_counts._2.map(file_counts._2._1, file_counts._2._2))   
        .reduceByKey((a, b) => if (a > b) a else b)

但我收到一条错误消息,提示 value map 不是 (String, Int) 的成员

这可以在 Spark 中实现吗?如果是这样,怎么办?我的方法从一开始就有缺陷吗?

【问题讨论】:

【参考方案1】:

为什么不只是:

val output = mention_rdd.reduceByKey 
  case ((file1, sum1), (file2, sum2)) =>
    if (sum2 >= sum1) (file2, sum2)
    else (file1, sum1)

【讨论】:

是的,就是这么简单。只是我偶然发现的任何其他示例都使用了扁平地图,这让我感到困惑。

以上是关于Spack [Scala]:按键减少嵌套元组值的主要内容,如果未能解决你的问题,请参考以下文章

Scala:使用map从列表中提取辅助元组值

如何使用嵌套元组或 HList 处理具有 Slick 的 > 22 列表?

按键精灵 循环问题 for 内 嵌套 if

如何展平嵌套元组?

是否可以在 BigQuery 中取消嵌套数组,以便将嵌套数据按键值拆分为列?

Scala 将多个元组中的 ID 减少为一个 ID