尝试使用catch表达式捕获Scala中的ArrayIndexOutOfBoundsException

尝试使用catch表达式捕获Scala中的ArrayIndexOutOfBoundsException,scala,apache-spark,Scala,Apache Spark,我有一个有一些坏数据记录的源文件,我想处理ArrayIndexOutofBoundsException并增加用于输出坏数据记录的累加器 val test = sourceFile.map(x => x.split("\\|")). filter(line => line(0).contains("1017")).map(x => { try { x.filter(line => { line.length >= 37

我有一个有一些坏数据记录的源文件,我想处理
ArrayIndexOutofBoundsException
并增加用于输出坏数据记录的累加器

val test = sourceFile.map(x => x.split("\\|")).
  filter(line => line(0).contains("1017")).map(x => {
    try {
      x.filter(line => {
        line.length >= 37
      }).map(x => x(38))
    }
    catch {
      case x: ArrayIndexOutOfBoundsException => {
        println("Bad Data Found".format(x))
        Linecounter += 1
        None
      }
    }
  })

test.count()
test.saveAsTextFile(Quotepath)
println("Bad Data Count %s:-".format(Linecounter))
问题是我无法将累加器输出视为记录计数示例1或等等。有人能帮忙确定这里出了什么问题吗。

让我们看看

val xs = (1 to 5).toArray
我们希望通过一些索引从
xs
中获取值,但它可能超出范围。我们将
xs
提升到一个部分函数上,从索引到相应的值

val xsL = xs.lift
xsL: Int => Option[Int] = <function1>
也就是说,索引
6
8
10
是不允许的

为了收集定义的零件,请考虑

res.flatten
Array[Int] = Array(3, 5)
为了计算越界索引的数量,请考虑

res.count(_ == None)
Int = 3
这种方法避免使用异常捕获和(可变)变量,同时包含所需的所有信息。

val xs = (1 to 5).toArray
我们希望通过一些索引从
xs
中获取值,但它可能超出范围。我们将
xs
提升到一个部分函数上,从索引到相应的值

val xsL = xs.lift
xsL: Int => Option[Int] = <function1>
也就是说,索引
6
8
10
是不允许的

为了收集定义的零件,请考虑

res.flatten
Array[Int] = Array(3, 5)
为了计算越界索引的数量,请考虑

res.count(_ == None)
Int = 3

这种方法避免使用异常捕获和(可变)变量,同时包含所需的所有信息。

无需使用“try”和“catch”子句来获取所需的功能:

val goodLines = sourceFile.map(x => x.split("\\|"))
                          .filter(_(0).contains("1017"))
                          .toSeq //just in case sourceFile is an Iterator

val test = goodLines.filter(_.length > 38)
                    .map(_(38))

val Linecounter = goodLines.count(_.length < 39)
val goodLines=sourceFile.map(x=>x.split(“\\\\”))
.filter(0.contains(“1017”))
.toSeq//以防sourceFile是迭代器
val test=goodLines.filter(长度>38)
.地图(38))
val Linecounter=goodLines.count(u.length<39)

无需使用“try”和“catch”子句来获得您想要的功能:

val goodLines = sourceFile.map(x => x.split("\\|"))
                          .filter(_(0).contains("1017"))
                          .toSeq //just in case sourceFile is an Iterator

val test = goodLines.filter(_.length > 38)
                    .map(_(38))

val Linecounter = goodLines.count(_.length < 39)
val goodLines=sourceFile.map(x=>x.split(“\\\\”))
.filter(0.contains(“1017”))
.toSeq//以防sourceFile是迭代器
val test=goodLines.filter(长度>38)
.地图(38))
val Linecounter=goodLines.count(u.length<39)

您的实际/预期输出是什么?输出中的0条记录与预期一致,但我希望当存在ArrayIndexOutOfBoundException示例错误数据计数时,累加器将递增:-1是否打印“发现错误数据”?Linecounter的定义是什么?坏数据计数:-0这是我现在想要打印的坏数据计数:-1如果您使用ArrayIndexOutOfBoundsException查找哪些“x”值没有39个元素,例如x(38),那么为什么不只计算满足该标准的值呢?换句话说,为什么要使用模糊的异常处理方法???您的实际/预期输出是什么?输出中的0条记录与预期一致,但我希望我的累加器在出现ArrayIndexOutOfBoundException示例错误数据计数时递增:-1是否打印“发现错误数据”?Linecounter的定义是什么?坏数据计数:-0这是我现在想要打印的坏数据计数:-1如果您使用ArrayIndexOutOfBoundsException查找哪些“x”值没有39个元素,例如x(38),那么为什么不只计算满足该标准的值呢?换句话说,为什么要使用异常处理的模糊方法???println(“错误状态行计数:-%s”)。format(FilterDataSet(“1013”)。filter(.length<10)。Count())println(“错误Luld行计数:-%s”)。format(FilterDataSet(“1041”)。filter(.length<10)。Count())println(“错误引用行计数:-%s”。format(FilterDataSet(“1017”).filter(.length<10).count())我无法在上述命令中获取大小,因此需要使用count是否有其他方法获取大小?我想您需要的是.count(.length<10).count())而不是filter(.length<10).您好,我喜欢您解释的第一个代码,它使用(size)而不使用out count,count是spark上的一种转换,但我无法找到大小函数。有很多方法可以剥猫皮:(I)过滤器(.length<10).大小,(ii).计数(.length if(l.length<10)1 else 0)).sumprintln(“坏状态行计数:-%s”).format(FilterDataSet(“1013”).filter(.length<10).count())println(“坏的Luld行计数:-%s”.format(FilterDataSet(“1041”).filter(.length<10).Count())println(“坏引号行计数:-%s”).format(FilterDataSet(“1017”).filter(551; length<10).Count())我无法使用上述命令获取大小,因此需要使用Count。还有其他方法获取大小吗?而不是使用filter(.10).Count()我想你想要的是.count(u.length<10)。嗨,我喜欢你的第一个代码,你解释说它使用(size)而不使用out count,count是一个转换,它在spark上是一个很复杂的转换,但我无法找到大小函数。有很多方法可以剥猫皮:(I)过滤器(.length<10)。size,(ii)count(.length if(l.length<10)1 else 0))。sum