【问题标题】:How to remove entries that contain empty values in an RDD that contains csv data?如何删除包含 csv 数据的 RDD 中包含空值的条目?
【发布时间】:2019-06-01 10:48:46
【问题描述】:

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

【问题讨论】:

标签: regex scala apache-spark functional-programming try-catch


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。由于我是 scala 新手并且不习惯语法/表达式,你能写代码来进一步过滤它吗?我想从 parsedData 中完全过滤空向量,因为我想将它用于 KMeans 算法。再次感谢我的朋友
  • 当然,只需添加filter(_.size != 0),这意味着只有大小至少为 1 的数组才能通过。我将编辑我的答案。
猜你喜欢
  • 2016-07-14
  • 2020-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2016-05-08
  • 2018-05-16
  • 2019-09-28
  • 2019-11-25
相关资源
最近更新 更多