当我尝试使用由于错误记录而生成的某些条件异常来过滤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
答案 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") )