【问题标题】:how to handle the Exception in spark map() function?如何处理 spark map() 函数中的异常?
【发布时间】:2015-05-04 06:43:59
【问题描述】:

我想忽略 map() 函数中的异常,例如:

rdd.map(_.toInt)

其中 rdd 是 RDD[String]。

但如果遇到非数字字符串,就会失败。

忽略任何异常并忽略该行的最简单方法是什么? (我不想用过滤器来处理异常,因为可能还有很多其他的异常......)

【问题讨论】:

  • 不需要纯函数处理异常:先过滤。
  • 我真的不认为过滤器是个好主意,因为我现在无法枚举所有可能的错误......所以运行的程序可能会在某一天突然失败......
  • 一点也不。过滤器只接受在解析时不会抛出异常的值:可解析为整数的字符串,这是明确定义的。 toInt 函数可以“抛出随机错误”,那么你就处于另一个泡菜中(和另一个问题)。

标签: scala apache-spark


【解决方案1】:

您可以结合使用Try 和地图/过滤器。

如果它们的行为符合预期,Try 会将您的计算包装成成功,如果抛出异常,则将其包装成失败。然后您可以过滤您想要的内容 - 在这种情况下是成功的计算,但您也可以过滤错误情况以用于记录目的,例如。

以下代码是一个可能的起点。您可以在scastie.org 中运行并探索它,看看它是否符合您的需求。

import scala.util.Try

object Main extends App {

  val in = List("1", "2", "3", "abc")

  val out1 = in.map(a => Try(a.toInt))
  val results = out1.filter(_.isSuccess).map(_.get)

  println(results)

}

【讨论】:

    【解决方案2】:

    我建议你使用过滤器/地图

    rdd.filter(r=>NumberUtils.isNumber(r)).map(r=> r.toInt)
    

    或平面图

    exampleRDD.flatMap(r=> {if (NumberUtils.isNumber(r)) Some(r.toInt) else  None})
    

    否则你可以在 map 函数中捕获异常

    myRDD.map(r => { try{
            r.toInt
        }catch {
            case runtime: RuntimeException => {
            -1
            }
        }
    })
    

    然后应用过滤器(在 -1 上)

    【讨论】:

    • 还有其他方式吗?我真的不认为过滤器是一个好主意,因为我现在无法枚举所有可能的错误......所以正在运行的程序可能会在某一天突然失败......
    • 如何在 rdd 的 flatMap 中使用 scala 选项?
    • @sb' 根据文档,RDD flatMap 采用函数女巫返回 TraversableOnce。也许我错过了一些东西,但看起来这段代码没有输入检查?
    • 现在我看到 Option 和 TravesableOnce 之间存在隐式转换。
    猜你喜欢
    • 2017-10-03
    • 2017-08-24
    • 2021-06-29
    • 1970-01-01
    • 2016-05-26
    • 2020-03-08
    • 2020-01-19
    • 2015-07-05
    • 2020-11-14
    相关资源
    最近更新 更多