[英]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.