Scala Spark 1.5.2 RDD [[A,B]]

时间:2016-11-01 12:34:00

标签: scala apache-spark

我遇到的问题是,我试图在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一起使用。

2 个答案:

答案 0 :(得分:2)

尝试

val left: RDD[A] = x.collect({case Left(x) => x})

我会在左侧放置错误并在右侧正确解析值 - 这就是通常的方式。 Scala 2.12也有右倾,正式编码该惯例。

答案 1 :(得分:1)

是的,您可以将EitherRDD

结合使用

过滤只想要你想要

rdd.filter(_.isLeft).map { case Left(a) => a}

rdd.filterNot(_.isRight).map { case Left(a) => a }