如何过滤掉不正确的记录?

时间:2015-11-09 10:34:34

标签: scala apache-spark

当我尝试使用由于错误记录而生成的某些条件异常来过滤RDD时。我想忽略那些不想捕获的记录。那么,当我使用filter方法时,如何添加try块?

scala> val newRDD = mysc1.filter(_(3) == "NS3")
newRDD: org.apache.spark.rdd.RDD[Array[String]] 
                      = MapPartitionsRDD[12] at filter at <console>:28
scala> newRDD.take(10)  

错误:

java.lang.ArrayIndexOutOfBoundsException: 3

3 个答案:

答案 0 :(得分:3)

mysc1.flatMap(x => Try(x(3)).filter(_ == "NS3").map(_ => x).toOption)

甚至更好地使用Array作为PartialFuntion

mysc1.flatMap(x => x.lift(3).filter(_ == "NS3").map(_ => x))

以获得胜任

mysc1.flatMap(x => for(y <- Try(x(3)).toOption if y == "NS3") yield x)

mysc1.flatMap(x => for(y <- x.lift(3) if y == "NS3") yield x)

最后是完整的for版本

val newRDD = for {
  x <- mysc1
  y <- x.lift(3) if y == "NS3"
} yield x

答案 1 :(得分:3)

在这个特定的例子中,它可以像

一样简单
mysc1.filter(arr => (arr.length > 3) && (arr(3) == "NS3"))

答案 2 :(得分:1)

scala> def filterFn[A](array: Array[A], valueToMatch: A): Boolean = array match {
     |   case Array(_, _, x, _*) if x == valueToMatch => true
     |   case _                                       => false
     | }
filterFn: [A](array: Array[A], valueToMatch: A)Boolean

scala> filterFn(Array(1,2,3), 3)
res2: Boolean = true

scala> filterFn( Array(), "foobar" )
res4: Boolean = false

然后,您可以执行以下操作:

mysc1.filter(xs => filterFn(xs, "NS3") )