您可以使用
Try
但是,请注意
尝试
应环绕整个车身
test
方法,而不仅仅应用于结果(您也不应该使用
return
关键字)。使用后
match
以获得结果。
def myUdf = udf((i: String, j: Int, k: String) => {
def test(ii: String, jj: Int, kk: String): Try[Int] = Try {
val q = i.toInt * j * k.toInt
val m = q * i.toInt
q
}
test(i, j, k) match {
case Success(lines) => lines.toString
case _ => "Failed"
}
})
请注意
k
以及
kk
是字符串类型,因为这是您在两个测试数据帧中所拥有的类型。如果您使用
Int
并且不能隐式转换列值(例如“df”),该行将不会运行udf,您将得到
null
。
使用两个数据帧的结果:
+---+---+---+------+
| a| b| c| D|
+---+---+---+------+
| as| 1| df|Failed|
| 1| 2| 3| 6|
+---+---+---+------+
+---+---+---+---+
| a| b| c| D|
+---+---+---+---+
| 1| 1| 3| 3|
| 1| 2| 3| 6|
+---+---+---+---+
-
可以看到,这将只给出值或
"Failed"
结果,成功被删除,即结果作为字符串返回。
-
在
测验
方法,将引发异常,该异常被
尝试
。这意味着该方法将在失败时退出,而不会继续到最后。
-
要查找所有失败的行,请使用
filter
方法:
df2.filter($"D" === "Failed")
。