对于列表元素尝试的 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
并没有真正的关系。 RDD
和 List
可能会以相同的结果结束。
你试过正式输入你的 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,它可能无法显示错误并显示不正确的类型(或者相反,它可能会显示工作代码中的错误):您需要实际构建项目查看真正的错误。
在 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
并没有真正的关系。 RDD
和 List
可能会以相同的结果结束。
你试过正式输入你的 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,它可能无法显示错误并显示不正确的类型(或者相反,它可能会显示工作代码中的错误):您需要实际构建项目查看真正的错误。