Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 巧妙处理Spark RDD中的选项[T]_Scala_Apache Spark_Optional - Fatal编程技术网

Scala 巧妙处理Spark RDD中的选项[T]

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

我正在使用ApacheSpark的Scala API开发一些代码,并试图巧妙地解决
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) }
我知道如果我使用一个简单的Scala
List
我可以使用
collect
方法:

val transformed = list.collect {
  case (a, Some(b)) => (b, a)
}
如我的问题中所述

使用Spark
RDD
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
}