对于列表元素尝试的 RDD 的理解

For-comprehensions over an RDD of Try of List elements

在 Spark 进程中我有一个 RDD[Try[(A, B)]]。我必须使用函数 f: B => List[C] 来转换此 RDD。我想要获得的是一个RDD[Try[(A, B, C)],其中我必须flatMap从函数f.

的应用中获得的列表

我试过这个:

val tryRdd = // Obtain the RDD[Try[(A, B)]]
val transformedRdd = 
  tryRdd.map {
    pair =>
      for {
        (a, b) <- pair
        c <- f(b)
      } yield {
        (a, b, c)
      }
  }

不幸的是,我得到的是 RDD[Try[Nothing]]。为什么?任何人都可以帮助我了解我错在哪里吗?

我想这个问题与 RDD 并没有真正的关系。 RDDList 可能会以相同的结果结束。

你试过正式输入你的 RDD 吗?

val transformedRdd : RDD[Try[Tuple3]] = ...

编辑: 如果这确实给您带来了错误,那么地图的输出就是错误的。 pair 变量的类型是 Try。 由于 scala 不会为您做这件事,您必须添加一些指令来与其内容(元组 (A,B))进行交互。 另外,您不必保留 Try 类型。 我会使用 flatMap 来保持成功并清理我的 RDD。 像

val transformedRdd = tryRdd.flatMap {value =>
  value match {
    case Success((a,b)) => ...
  }
}

观看 http://www.scala-lang.org/api/2.9.3/scala/util/Try.html 了解更多关于 Try class 的信息。

for-comprehension翻译成

pair.flatMap { case (a, b) => f(b).map { case c => (a, b, c) } }

但是 f(b).map(...) 会给你一个 List[(A, B, C)],而不是你想要的 pair.flatMap 的参数 Try[(A, B, C)]。所以代码根本不应该编译(除非你在范围内有一个奇怪的隐式转换)。

但是,如果您使用的是 IntelliJ,它可能无法显示错误并显示不正确的类型(或者相反,它可能会显示工作代码中的错误):您需要实际构建项目查看真正的错误。