【问题标题】:catch an error on spark在 spark 上捕获错误
【发布时间】:2017-07-26 14:24:01
【问题描述】:

我使用这样的代码来执行一些转换并继续该过程,即使我的价值不高:

import scala.util.Try

val data = Array(Seq(1, 2), Seq(3, 4, 5))
val rdd = sc.parallelize(data)
val rdd_test = rdd.flatMap(x => Try(x(2)).toOption)
rdd_test.collect.foreach(println)

这个简单的代码返回 5,因为在我的第一行中,我在第三个位置没有任何值。我的问题是如何捕捉第一行以便使用 log4j 记录警报消息。我想说的是:Index Error. 你有什么主意吗?

【问题讨论】:

  • 如果要遍历Seq,请使用map,rdd.map { x => x(2) }.collect
  • 这失败了,因为第一个 Seq 只有 2 个元素
  • 感谢您的评论,但这只是一个示例代码。我的真实代码处理非常大的数据,这是一个火花流作业,所以我不能执行收集。
  • collect 是为了展示行为的示例,主要思想是使用 map 而不是 flatMap。
  • 如果 seq 没有​​ 3 个元素,那么之后的任何操作都会在映射后出错

标签: scala apache-spark log4j


【解决方案1】:

您可以使用SuccessFailure 对其进行评估,并以这种方式创建Option

rdd.flatMap{x =>
  val resTry = Try(x(2))
  resTry match {
    case Success(res)  => Some(res)
    case Failure(e) => logger.error("Error: " + Throwables.getStackTraceAsString(e))
      None
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2022-06-21
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多