[英]Spark/Scala - Failed to execute user defined function
我有以下有效的代碼。
val locList = Source.fromInputStream(getClass.getResourceAsStream("/locations.txt")).getLines().toList
def locCheck(col: String): Boolean = locList.contains(col)
def locUDF = udf[Boolean, String](locCheck)
但是當我添加一個toUpperCase
來制作它時
val locList = Source.fromInputStream(getClass.getResourceAsStream("/locations.txt")).getLines().toList
def locCheck(col: String): Boolean = locList.contains(col.toUpperCase)
def locUDF = udf[Boolean, String](locCheck)
我遇到了由Failed to execute user defined function
的java.lang.NullPointerException
我使用 udf 作為df.filter(locUDF('location)).count()
我在這里做錯了什么,我該如何解決?
udf
或 udf 沒有任何問題。 問題在於進入udf
的數據。
在您的情況下,如果列location
具有null
值,則當您將這些值傳遞給null
時, col
的值為udf
。
然后,如果 col 是 null,則在調用col.toUpperCase
時會收到NullPointerException
。
您可以簡單地檢查 function 中的 null 值
def locCheck(col: String): Boolean = if (col == null) false else locList.contains(col.toUpperCase)
或者您可以使用 Options 來處理它
def locCheck(col: String): Boolean =locList.contains(Option(col).map(_.toUpperCase))
希望這可以幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.