代码之家  ›  专栏  ›  技术社区  ›  riccardo.cardin

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

  •  2
  • riccardo.cardin  · 技术社区  · 9 年前

    我正在使用Apache Spark的Scala API开发一些代码,并试图巧妙地解决 RDD s包含一些 Option[T] .

    假设我们有以下列表

    val rdd: RDD[(A, Option[B])] = // Initialization stuff
    

    我们希望对 rdd 获得以下信息

    val transformed: RDD[(B, A)]
    

    为所有人 Option[B] 评估为 Some[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)
    }
    

    如中所述 this 我的问题也是如此。

    使用Spark RDD公司 相反,我有哪种选择??

    2 回复  |  直到 9 年前
        1
  •  5
  •   Jean Logeart    9 年前

    您可以使用 flatMap :

    rdd.flatMap {
       case (a, Some(b)) => Some(b, a)
       case _ => None
    }
    
        2
  •  4
  •   zero323 little_kid_pea    8 年前

    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)
    
    推荐文章