我正在 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)如何处理通过捕获创建的选项类型,而无需先显式过滤掉 None ,然后将 .get 函数映射并应用于非 None 选项值?
我尝试应用 .flatMap(identity) 步骤来摆脱 Nones,但得到了预期的:TraversableOnce[?] 异常。