Scala 巧妙处理Spark RDD中的选项[T]
我正在使用ApacheSpark的Scala API开发一些代码,并试图巧妙地解决Scala 巧妙处理Spark RDD中的选项[T],scala,apache-spark,optional,Scala,Apache Spark,Optional,我正在使用ApacheSpark的Scala API开发一些代码,并试图巧妙地解决RDDs之间包含一些Option[T]的基本转换 假设我们有以下列表 val rdd: RDD[(A, Option[B])] = // Initialization stuff 我们希望对rdd应用一个转换,以获得以下结果 val transformed: RDD[(B, A)] 对于所有计算结果为部分[B]的选项[B]。我发现最好的方法是应用以下转换链: val transformed = rdd.f
RDD
s之间包含一些Option[T]
的基本转换
假设我们有以下列表
val rdd: RDD[(A, Option[B])] = // Initialization stuff
我们希望对rdd
应用一个转换,以获得以下结果
val transformed: RDD[(B, A)]
对于所有计算结果为部分[B]的选项[B]
。我发现最好的方法是应用以下转换链:
val transformed =
rdd.filter(_.isDefined)
.map { case (a, Some(b)) => (b, a) }
我知道如果我使用一个简单的ScalaList
我可以使用collect
方法:
val transformed = list.collect {
case (a, Some(b)) => (b, a)
}
如我的问题中所述
使用SparkRDD
s替代,我有哪种选项???RDD
提供了转换,相当于:
您可以使用
flatMap
:
rdd.flatMap {
case (a, Some(b)) => Some(b, a)
case _ => None
}
@这实际上是一个有效的解决方案:)@riccardo.cardin我想我在回答这个问题。让我知道这对你没有帮助,我会更新我的答案:)@riccardo.cardin这是你问题的答案。请注意,collect函数相当于flatMap的这种用法。对不起,你说得对。我没有注意到API中有两个版本的
collect
方法。@azuras你错了。请阅读文档和源代码,了解收集:PartialFunction[T,U]=>ClassTag[U]=>RDD[U]的工作原理。
rdd.flatMap {
case (a, Some(b)) => Some(b, a)
case _ => None
}