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)
对我不起作用。但是,我怀疑 a
和 b
可能是 Apache Spark PairRDD
集合(或类似的东西)。如果是这种情况,那么你可以连接 a
和 b
,然后将值映射到每对的最小值(reduce
操作不是你想要的)如下:
a.join(b).mapValues(v => Math.min(v._1, v._2)).collect
collect
根据需要将结果转换为 Array[(String, Int)]
。
我有两个 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)
对我不起作用。但是,我怀疑 a
和 b
可能是 Apache Spark PairRDD
集合(或类似的东西)。如果是这种情况,那么你可以连接 a
和 b
,然后将值映射到每对的最小值(reduce
操作不是你想要的)如下:
a.join(b).mapValues(v => Math.min(v._1, v._2)).collect
collect
根据需要将结果转换为 Array[(String, Int)]
。