【发布时间】:2015-02-05 06:17:55
【问题描述】:
我正在 scala 中编写一个 Spark 应用程序,并希望处理一个脏输入文件。
// CSV file
val raw_data = sc.textFile(...)
val clean_data = raw_data.map(_.split(delimiter))
.map( r => (r(0), r(1).toDouble)
当 r(1) 不是数字时会抛出 NumberFormatException。这发生在丑陋的输入数据中的少数行上。
我终于找到了一种丑陋的方式来完成我需要的事情:
import scala.util.control.Exception._
val clean_data = raw_data.map(_.split(delimiter))
.map( r => (r(0),
catching(classOf[NumberFormatException]).opt(r(1).toDouble))
.filter( r => r._2 != None)
.map( r => (r._1, r._2.get))
这给我留下了两个问题。
1) 在地图中简单地删除格式错误的行的最佳方法是什么?
2) 如何处理通过 catch 创建的 Option 类型,而无需先显式过滤掉 None,然后将 .get 函数映射并应用于非 None Option 值?
我尝试应用 .flatMap(identity) 步骤来摆脱 Nones,但得到了预期的:TraversableOnce[?] 异常。
【问题讨论】:
标签: scala exception-handling apache-spark rdd