如何在包含csv数据的RDD中删除包含空值的条目?

时间:2019-01-06 15:36:13

标签: scala csv apache-spark rdd

我正在尝试将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)
})

1 个答案:

答案 0 :(得分:2)

您可以过滤掉为空的项目,只需将filter方法添加到流中即可。

val parsedData = data.map(s => Vectors.dense(s.split(',').filter(!_.isEmpty).map(_.toDouble))).filter(_.size != 0)

这样,任何空行都会导致空Vector,可以对其进行进一步过滤。