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

问题描述 投票:-4回答:1

我有一个平面地图,返回序列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)

}

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

scala apache-spark reduce flatmap
1个回答
0
投票

这是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))
© www.soinside.com 2019 - 2024. All rights reserved.