首页 > 解决方案 > 如何删除包含 csv 数据的 RDD 中包含空值的条目?

问题描述

我正在尝试将 csv 文件中的值映射到 RDD,但由于某些字段为空,因此出现以下错误。

线程“主”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)
})

标签: regexscalaapache-sparkfunctional-programmingtry-catch

解决方案


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

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

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


推荐阅读