我有两个Key / Value Pairs Array [(String,Int)]数组,我想加入,但只有在键上匹配时才返回最小值。
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))]
。
答案 0 :(得分:2)
试试这个:
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
仅用于保留a.toMap
中同样位于b.toMap
的密钥(字符串)。然后,map
操作为每个键选择两个可用值的最小值,并创建一个新的映射,将每个键与该最小值相关联。最后,我们使用Array[(String, Int)]
将结果地图转换回toArray
。
<强>已更新强>
顺便说一句:我不确定你从哪里获得Array.join
方法:Array
没有这样的方法,所以a.join(b)
没有为我工作。但是,我怀疑a
和b
可能是 Apache Spark PairRDD
集合(或类似的东西)。如果是这种情况,那么您可以加入a
和b
,然后将值映射到每对的最小值(reduce
操作不是您想要的)如下:
a.join(b).mapValues(v => Math.min(v._1, v._2)).collect
collect
可根据需要将结果转换为Array[(String, Int)]
。