簡體   English   中英

UDF 中的異常處理:Spark 1.6

[英]Exception handing in a UDF : Spark 1.6

   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)
      }
    }

這個 function 所做的是將一列字符串解析為鍵和值數組。 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]的數組。 有什么建議么?

您可以使用Try class

代替

(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

作為一個整體與您的 function:

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 class 的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM