Scala拆分RDD[Either[String,Book]]时遇toSeq成员不存在错误求助
解决RDD[Either[L, R]]拆分时的
toSeq is not a member of Either错误 看起来你是想通过隐式类给RDD[Either[L,R]]添加拆分方法,但误用了toSeq——毕竟Either是二选一的单一结果类型,不是集合类,自然没有toSeq方法。下面给你两种靠谱的解决方案,以及正确的隐式类实现:
方案1:使用partition一次性拆分(性能更优)
Spark的RDD自带partition方法,可以一次遍历就把RDD拆分为两个分别对应Left和Right的子RDD,再提取内部值即可:
import org.apache.spark.rdd.RDD import scala.util.Either implicit class EitherRDDOps[L, R](rdd: RDD[Either[L, R]]) { def split: (RDD[L], RDD[R]) = { val (leftRDD, rightRDD) = rdd.partition(_.isLeft) // 从Left/Right中安全提取内部值 (leftRDD.map(_.left.get), rightRDD.map(_.right.get)) } }
使用时直接调用拆分方法:
val (failedTexts, parsedBooks) = yourEitherRDD.split
方案2:分别过滤Left和Right(代码更直观)
如果你想要更清晰的代码结构,也可以分别过滤两种类型的元素,再提取对应的值:
import org.apache.spark.rdd.RDD import scala.util.Either implicit class EitherRDDOps[L, R](rdd: RDD[Either[L, R]]) { def lefts: RDD[L] = rdd.filter(_.isLeft).map(_.left.get) def rights: RDD[R] = rdd.filter(_.isRight).map(_.right.get) }
使用示例:
val failedTexts = yourEitherRDD.lefts // 得到RDD[String] val parsedBooks = yourEitherRDD.rights // 得到RDD[Book]
为什么会出现这个错误?
你大概率尝试了类似rdd.flatMap(_.toSeq)的写法,但Either本身并没有实现toSeq方法——它不是包含多个元素的集合,而是代表要么成功、要么失败的单一结果。如果非要用集合式的方式处理(比如合并两种元素到同一个RDD),可以手动把Either转成Seq,但这种方式不适合拆分场景:
// 仅作示例,不推荐用于拆分场景 rdd.flatMap { case Left(l) => Seq(l) case Right(r) => Seq(r) }
内容的提问来源于stack exchange,提问作者Vivian
相关产品推荐
相关产品推荐

