如何在 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 方法
如何在 PySpark 中使用自定义行分组来 reduceByKey?