Scala 加入数组并减少价值

Scala Join Arrays and Reduce on Value

我有两个 Key/Value 对数组 [(String, Int)] 的数组,我想加入,但只有 return 键匹配时的最小值。

val a = Array(("personA", 1), ("personB", 4), ("personC", 5))
val b = Array(("personC", 4), ("personA", 2))

目标:c = Array((personA, 1), (personC, 4))

val c = a.join(b).collect()

结果:c = Array((personA, (1, 2)), (personC, (5, 4)))

我尝试使用 join 方法实现此目的,但在将值连接到单个数组后很难减少值:Array[(String, (Int, Int))]

试试这个:

val a = Array(("personA", 1), ("personB", 4), ("personC", 5))
val b = Array(("personC", 4), ("personA", 2))
val bMap = b.toMap
val cMap = a.toMap.filterKeys(bMap.contains).map {
  case(k, v) => k -> Math.min(v, bMap(k))
}
val c = cMap.toArray

toMap方法将Array[(String, Int)]转换为Map[String, Int]filterKeys 然后用于仅保留也在 b.toMap 中的 a.toMap 中的键(字符串)。 map 操作然后为每个键选择两个可用值中的最小值,并创建一个将每个键与该最小值相关联的新映射。最后,我们使用 toArray.

将生成的地图转换回 Array[(String, Int)]

已更新

顺便说一句:我不确定您从哪里获得 Array.join 方法:Array 没有这样的方法,所以 a.join(b) 对我不起作用。但是,我怀疑 ab 可能是 Apache Spark PairRDD 集合(或类似的东西)。如果是这种情况,那么你可以连接 ab,然后将值映射到每对的最小值(reduce 操作不是你想要的)如下:

a.join(b).mapValues(v => Math.min(v._1, v._2)).collect

collect 根据需要将结果转换为 Array[(String, Int)]