如何在 Scala 中使用 ReduceByKey() 获取每个不同键的最小值

Posted

技术标签:

【中文标题】如何在 Scala 中使用 ReduceByKey() 获取每个不同键的最小值【英文标题】:How to get minimum value for each distinct key using ReduceByKey() in Scala 【发布时间】:2019-08-20 17:19:10 【问题描述】:

我有一个返回序列Seq((20,6),(22,6),(23,6),(24,6),(20,1),(22,1)) 的平面映射,现在我需要在从平面映射得到的序列上使用reduceByKey() 来找到每个键的最小值。

我尝试使用.reduceByKey(a,min(b)).reduceByKey((a, b) => if (a._1 < b._1) a else b),但它们都不起作用。

这是我的代码

for(i<- 1 to 5)

var graph=graph.flatMap in => in match case (x, y, zs) => (x, y) :: zs.map(z => (z, y))
.reduceByKey((a, b) => if (a._1 < b._1) a else b)


对于平面图生成的每个不同的键,我需要获取该键的最小值。例如:平面图生成 Seq((20,6),(22,6),(23,6),(24,6),(20,1),(22,1)) resultByKey() 应该生成 ( 20,1),(22,1),(23,6),(24,6)

【问题讨论】:

开头graph里面是什么? “他们都没有工作”并不是一个真正的问题...... 在代码 sn-p 之前显示graph 的类型会更容易。有时,如果不是经常的话,解释你的算法试图实现的目标也可能会有所帮助。也许人们知道一个更简单的解决方案,或者它甚至在某个地方存在一个实现。例如,您的代码看起来像一些图形算法 @Dima 问题在标题中... 【参考方案1】:

这是reduceByKey的签名:

def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]

基本上,给定一个键/值对的 RDD,您需要提供一个函数将两个值(而不是整个值对)归为一个。因此,您可以按如下方式使用它:

val rdd = sc.parallelize(Seq((20,6),(22,6),(23,6),(24,6),(20,1),(22,1)))
val result = rdd.reduceByKey((a, b) => if (a < b) a else b)
result.collect
// Array[(Int, Int)] = Array((24,6), (20,1), (22,1), (23,6))

【讨论】:

以上是关于如何在 Scala 中使用 ReduceByKey() 获取每个不同键的最小值的主要内容,如果未能解决你的问题,请参考以下文章

在 Scala Spark 中找不到 reduceByKey 方法

reduceByKey和groupByKey的区别

reducebykey和groupbykey的区别

如何在 PySpark 中使用自定义行分组来 reduceByKey?

如何在pyspark中使用reduceByKey作为多键和单值[重复]

Spark算子系列第1篇: reduceByKey 和 groupByKey