如何在Scala中使用ReduceByKey()获得每个唯一键的最小值

时间:2019-03-29 17:46:17

标签: scala apache-spark reduce flatmap

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

1 个答案:

答案 0 :(得分: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))