我創建了一個基於Java函數MaskFormatter磚/ Scala的函數。
但是當我從sparksql調用它,我收到錯誤消息
錯誤的SQL語句:AnalysisException:未定義的功能:formatAccount。這個函數既不是內置/臨時函數,也不是一個持久性函數spark_catalog.default.formataccount資格。1號線pos 32
這是我的函數
進口javax.swing.text。MaskFormatter def formatAccount(賬戶:字符串,麵具:String):字符串= {val格式化程序=新MaskFormatter(麵具。替換(“X”,“A”)) formatter.setValueContainsLiteralCharacters(假)val formatAccount = formatter.valueToString(賬戶)formatAccount}
這是查詢代碼,收到錯誤消息
sql(" " "選擇java_method (emitToKafka formatAccount (“1222233334”、“X-XXXX-XXXX-X”)) " " ")
但是如果我運行下麵的代碼,它將正常工作。
formatAccount (“1222233334”、“X-XXXX-XXXX-X”)
res0:字符串= 1-2222-3333-4
可能錯過了什麼?
@Tim張:
問題是formatAccount函數被定義為一個Scala函數,但SparkSQL正在尋找一個SQL函數。你需要注冊Scala函數作為一個SQL函數,這樣就可以從SparkSQL調用。你可以注冊使用spark.udf Scala函數作為SQL函數。注冊方法。下麵是一個示例代碼片段:
進口org.apache.spark.sql.functions。udf val formatAccountUDF = udf((賬戶:字符串,麵具:字符串)= > {val格式化程序= new MaskFormatter(麵具。替換(“X”,“A”)) formatter.setValueContainsLiteralCharacters(假)val formatAccount = formatter.valueToString formatAccount}) spark.udf(帳戶)。注冊(“formatAccount formatAccountUDF)
注冊功能後,您可以使用它在你SparkSQL查詢:
sql(" " "選擇formatAccount (“1222233334”、“X-XXXX-XXXX-X”) " " ")
希望這應該工作。