我正在使用Apache Spark的Scala API开发一些代码,我正在尝试巧妙地解决包含一些RDD
的{{1}}之间的基本转换。
假设我们有以下列表
Option[T]
我们希望将转化应用于val rdd: RDD[(A, Option[B])] = // Initialization stuff
以获取以下内容
rdd
适用于评估为val transformed: RDD[(B, A)]
的所有Option[B]
。我发现这样做的最好方法是应用以下转换链:
Some[B]
我知道如果我使用简单的Scala val transformed =
rdd.filter(_.isDefined)
.map { case (a, Some(b)) => (b, a) }
,我可以使用List
方法:
collect
如this中提到的那样。我的问题。
使用Spark val transformed = list.collect {
case (a, Some(b)) => (b, a)
}
代替,我有哪种选择?
答案 0 :(得分:4)
RDD
提供collect
转换,相当于Iterable.collect
:
import org.apache.spark.rdd.RDD
val rdd = sc.parallelize(Seq((1L, None), (2L, Some("a"))))
val transformed: RDD[(String, Long)] = rdd.collect {
case (a, Some(b)) => (b, a)
}
transformed.count
// Long = 1
transformed.first
// (String, Long) = (a,2)
答案 1 :(得分:4)
您可以使用flatMap
:
rdd.flatMap {
case (a, Some(b)) => Some(b, a)
case _ => None
}