首页 > 解决方案 > 如何组合 RDD 集中的值?

问题描述

如果我有一个RDD[(Int, Array[Boolean])],我怎么能组合每组的值?

例如

如果我RDD是:

(1, Array(true, false, true)) (2, Array(true, true, false)) 

我想要的结果是:

(1, Array(true, true, true)) (2, Array(true, true, true))

标签: scalaapache-sparkset

解决方案


如果我理解正确,您希望 RDD 中的所有记录都具有相同的,该值是数组每个索引上按位或运算的结果数组。

在这种情况下,您可以从reduce计算这个单个值的操作开始,然后将原始 RDD 映射到一个新的 RDD 中,并为所有记录提供这个新值:

val newVal = rdd.values.reduce((a1, a2) => a1.zip(a2).map { case (b1, b2) => b1 | b2 })
val result = rdd.mapValues(_ => newVal)

result.mapValues(_.toList).foreach(println) 
// prints:
// (1,List(true, true, true))
// (2,List(true, true, true))

请注意,此解决方案忽略了诸如空输入或数组大小不等的边缘情况。


推荐阅读