2016-08-22 19 views
0

我有一个RDD[Try[(A, B)]]。我必须使用函数f: B => List[C]来转换此RDD。我想获得的是一个RDD[Try[(A, B, C)],其中我必须flatMap从函数f的应用程序获得的列表。在Spark过程中尝试使用列表元素的RDD的解释

我tryed这一点:

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没有什么关系。 Probabily RDDList将以相同的结果结束。

回答

2

的换理解被翻译成

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,它可能无法显示错误并显示不正确的类型(或者其他方式,它可以在工作代码中显示错误):您需要实际构建项目看到真实的错误。

+0

是的,我正在使用IntelliJ。我将尝试构建我的代码,然后我会让你知道。 –

0

您是否试图正式输入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有关尝试类的更多信息。

+0

是的,错误如下:RDD类型的表达式[Try [Nothing]]不符合期望的RDD类型[Try(A,B,C)] _ –