【问题标题】:Exception handing in a UDF : Spark 1.6UDF 中的异常处理:Spark 1.6
【发布时间】:2020-11-14 14:43:18
【问题描述】:
   def parse_values(value: String) = {
      val values = value.split(",").map(_.trim)
      values.foldLeft(Array[(Int, Double)]()) {
        case (acc, present) =>
          val Array(k, v) = {
            present.split(",")(0).split(":") match {
              case Array(_) => Array("0", "0.0")
              case arr => arr
            }
          }
          acc :+ (k.trim.toInt, v.trim.toDouble)
      }
    }

这个函数的作用是将一列字符串解析为键和值的数组。 “50:63.25,100:58.38”到[[50,63.2], [100,58.38]]。这是我的 UDF,它创建了一个包含 int 和 Double 结构元素的包装数组。

 |    |-- element: struct (containsNull = true)
 |    |    |-- _1: integer (nullable = false)
 |    |    |-- _2: double (nullable = false)

在某些情况下,输入字符串的格式不正确并且我收到错误:java.lang.NumberFormatException 输入字符串:因为“k.trim.toInt”无法转换像“.01-4.1293”这样的脏数据,这是一个巨大数据集中的异常字符串。谁能帮我解决这个问题?

发生异常时,我想返回一个空数组或带有[0,0.0] 的数组。有什么建议吗?

【问题讨论】:

    标签: scala dataframe apache-spark exception user-defined-functions


    【解决方案1】:

    您可以使用Try

    代替

    (k.trim.toInt, v.trim.toDouble)
    

    getOrElse 将其封装在Try 中,例如:

    (Try(k.trim.toInt).getOrElse(0), Try(v.trim.toDouble).getOrElse(0.0))
    

    如果成功,它将返回正确的值,如果失败,它将返回您想要的默认值

    在这里快速测试:

    val invalid: String = .01-4.1293
    val valid: String = 56
    
    
    Try(invalid.trim.toInt).getOrElse(0)
    res19: Int = 0
    
    Try(valid.trim.toInt).getOrElse(0)
    res20: Int = 56
    

    作为一个整体与你的功能:

    import scala.util.Try
    
       def parse_values(value: String) = {
          val values = value.split(",").map(_.trim)
          values.foldLeft(Array[(Int, Double)]()) {
            case (acc, present) =>
              val Array(k, v) = {
                present.split(",")(0).split(":") match {
                  case Array(_) => Array("0", "0.0")
                  case arr => arr
                }
              }
              acc :+ (Try(k.trim.toInt).getOrElse(0), Try(v.trim.toDouble).getOrElse(0.0))
          }
        }
    

    您还可以找到有关功能错误处理和 Try 类here的更多信息

    【讨论】:

      猜你喜欢
      • 2020-11-13
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2021-12-07
      • 2016-05-26
      • 2020-03-08
      • 1970-01-01
      • 2017-01-24
      相关资源
      最近更新 更多