我正在尝试将csv文件中的值映射到RDD中,但由于某些字段为空,因此出现以下错误。
线程“ main”中的异常org.apache.spark.SparkException:由于阶段失败而导致作业中止:阶段0.0中的任务0失败1次,最近一次失败:阶段0.0中的任务0.0丢失(TID 0,本地主机,执行者驱动程序):java.lang.NumberFormatException:空字符串
以下是我正在使用的代码。
// Load and parse the data
val data = sc.textFile("data.csv")
val parsedData = data.map(s => Vectors.dense(s.split(',').map(_.toDouble))).cache()
有什么方法可以检查是否为空?我想过用try catch方法来做,但是似乎不起作用。
val parsedData = data.map(s => {
try {
val vector = Vectors.dense(s.split(',').map(_.toDouble))
}catch{
case e:NumberFormatException => println("Nulls somewhere")
}
(vector)
})
答案 0 :(得分:2)
您可以过滤掉为空的项目,只需将filter
方法添加到流中即可。
val parsedData = data.map(s => Vectors.dense(s.split(',').filter(!_.isEmpty).map(_.toDouble))).filter(_.size != 0)
这样,任何空行都会导致空Vector
,可以对其进行进一步过滤。