Scala-如何在Spark中的Map函数内部实现Try

时间:2018-10-16 16:53:33

标签: scala apache-spark exception exception-handling nullpointerexception

由于java.lang.NullPointerException转换中的函数抛出了map,因此我有一个Spark作业失败的阶段。

我的想法是借助map类型从Try内部获取损坏的Sale对象。 因此,我有意将函数结果分配给saleOption变量,然后进行模式匹配。

不幸的是,我当前的实现无法正常工作,我需要有关如何修复它的建议。感谢您的任何建议。

这是初始方法:

  def filterSales(rawSales: RDD[Sale]): RDD[(String, Sale)] = {
    rawSales
      .map(sale => sale.id -> sale) // throws NullPointerException
      .reduceByKey((sale1, sale2) => if (sale1.timestamp > sale2.timestamp) sale1 else sale2)
  }

这是我实现我的想法的方式:

def filterSales(rawSales: RDD[Sale]): RDD[(String, Sale)] = {
      rawSales
      .map(sale => {
        val saleOption: Option[(String, Sale)] = Try(sale.id -> sale).toOption
        saleOption match {
          case Success(successSale) => successSale
          case Failure(e) => throw new IllegalArgumentException(s"Corrupted sale: $rawSale;", e)
        }

      })
       .reduceByKey((sale1, sale2) => if (sale1.timestamp > sale2.timestamp) sale1 else sale2)
      }

UPD::我的意图是将其用于调试目的,并提高我的Scala知识。我不会使用TryExceptions进行流量控制。

2 个答案:

答案 0 :(得分:0)

如果您只想忽略10000 50005000,请删除它们,不要抛出异常。例如

sum=50005000

答案 1 :(得分:0)

Try不应用于流量控制。 Exception仅在例外情况下使用。最好的解决方案是修复您的NullPointerException。如果不应该有任何空值,则说明生成RDD的代码中存在错误。如果您期望潜在的空值(例如来自格式错误的输入数据),则应该使用RDD[(String,Option[Sale])]

相关问题