分享

请教各位老师,文件操作出现问题!

使用spark开发程序,需要从大量如下格式的txt文本中读取数据,编写程序以后发现只能操作其中单个文本,操作多个文本时只操作了第一个文本,并出现下图中的错误,这说明程序对文件的操作有问题,不是对于每个文本都执行此程序,而是把所有文本当做一个来处理,也就是程序只执行了一次,这是有问题的,请问各位老师应该如何解决这个问题?在此附上一小段出现问题的程序: 错误.jpg 数据格式.jpg
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.SparkSession
import scala.collection.mutable.ArrayBuffer
object GETDATA {
  def get_data(source: Array[String],line_Number:Double)={
    val data=new ArrayBuffer[Double]()
    //val lineIterator: RDD[Array[String]] = source.map(_.split(" "))
    var nline=0.0
    for (line<-source){
      nline+=1.0
      println(nline.toInt)
      println(line)
      if (nline>=line_Number+2.0){
        data+=line.toDouble
      }
    }
    data
  }

  def main(args: Array[String]): Unit = {
    val spark=SparkSession.builder().master("local")
      .appName("MomentTensorAnalysis").getOrCreate()
    val file: RDD[String] = spark.sparkContext.textFile("f://*.txt")
    val vector1: Array[String] = file.collect.toList.toArray
    val result: ArrayBuffer[Double] = get_data(vector1, 11.0)
    println(result)
  }

}

已有(4)人评论

跳转到指定楼层
yaojiank 发表于 2018-7-4 20:59:30
先采用测试数据。可能是数据不规则,程序不能兼容,导致异常错误。数据不能再读下去。归根结底,可能是没有考虑异常。
回复

使用道具 举报

1601365 发表于 2018-7-4 21:39:38
NumberFormatException说明是非法字符转换为数据类型。在文本中体现出来就是每个文本的开始,1-11行都有一段英文说明。测试程序只能操作一个文本,操作第二个文本时就会出现异常,说明此时并未执行“跳过英文说明”部分,并将数据存入data的过程。很可能是这个问题,但不知道该怎么解决。
回复

使用道具 举报

bioger_hit 发表于 2018-7-5 10:45:50
本帖最后由 bioger_hit 于 2018-7-5 10:49 编辑
1601365 发表于 2018-7-4 21:39
NumberFormatException说明是非法字符转换为数据类型。在文本中体现出来就是每个文本的开始,1-11行都有一 ...

先定位错误,把数据找出来。然后调试程序,修改为兼容即可。一个if else,考虑到异常的数据。
  for (line<-source){
      nline+=1.0
      println(nline.toInt)
      println(line)
      if (nline>=line_Number+2.0){
        data+=line.toDouble
      }


比如上面
   println(nline.toInt),这里直接转换为int,你确定都是整形吗?
如果转换失败,就会出异常,首先做个类型判断,如果不是这个类型,你该如何处理。
类型判断这个不用说了吧。
如果是整形执行下面内容
   if (nline>=line_Number+2.0){
        data+=line.toDouble
      }

如果不是,在另做处理


回复

使用道具 举报

1601365 发表于 2018-7-6 16:32:50
bioger_hit 发表于 2018-7-5 10:45
先定位错误,把数据找出来。然后调试程序,修改为兼容即可。一个if else,考虑到异常的数据。
  for (li ...

nline肯定没什么问题,是用来记录行号的,我想是因为每个文件的开头都有一段英文,但是程序中我明明跳过了开头,程序却依然未跳过除第一个文本以外其他文本的开头。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条