我遇到的问题是,我试图在RDD中使用scala的Either
,似乎已经走上了一条黑暗的道路。
我的应用程序使用spark上下文将数据读入RDD[String]
。
然后将此RDD[String]
解析为Left[A]
或Right[B]
(Either[A,B]
),因为我希望保留不可解析的记录,以便我可以将它们放到别处。
我已经到了我想以不同方式对待A和B的地步......因此试着打电话
left: RDD[A] = (x:RDD[Either[A,B]]).map(_.left.get)
这里的问题是,如果x没有任何错误(左侧),这将引发异常。我可以尝试捕获异常但是地图仍然需要我返回RDD[A]
sc.empty[RDD]
或.getOrElse
无法完成。
如果有人有工作解决方案,或者请在最佳实践中纠正我,我猜测Eithers并不打算与RDD一起使用。
答案 0 :(得分:2)
尝试
val left: RDD[A] = x.collect({case Left(x) => x})
我会在左侧放置错误并在右侧正确解析值 - 这就是通常的方式。 Scala 2.12也有右倾,正式编码该惯例。
答案 1 :(得分:1)
是的,您可以将Either
与RDD
过滤只想要你想要
rdd.filter(_.isLeft).map { case Left(a) => a}
或
rdd.filterNot(_.isRight).map { case Left(a) => a }