巧妙地处理Spark RDD中的Option [T]

时间:2016-02-10 21:42:33

标签: scala apache-spark optional

我正在使用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) } 代替,我有哪种选择?

2 个答案:

答案 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
}