注册函数时Databricks SCALA UDF无法加载类
Posted
技术标签:
【中文标题】注册函数时Databricks SCALA UDF无法加载类【英文标题】:Databricks SCALA UDF cannot load class when registering function 【发布时间】:2022-01-16 23:47:05 【问题描述】:我已经关注this guide 和this question 尝试实现解密函数以在 SQL 视图中使用。
我已将示例中的此 scala 代码编译为 jar 文件并上传到 Databricks 文件系统 (DBFS):
import com.macasaet.fernet.Key, StringValidator, Token;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.time.Duration, Instant;
class Validator extends StringValidator
override def getTimeToLive() : java.time.temporal.TemporalAmount =
Duration.ofSeconds(Instant.MAX.getEpochSecond());
class udfDecrypt extends UDF
def evaluate(inputVal: String, sparkKey : String): String =
if( inputVal != null && inputVal!="" )
val keys: Key = new Key(sparkKey)
val token = Token.fromString(inputVal)
val validator = new Validator()
val payload = token.validateAndDecrypt(keys, validator)
payload
else return inputVal
我可以像演示的那样声明函数:
%sql
CREATE OR REPLACE FUNCTION default.udfDecrypt AS 'com.nm.udf.udfDecrypt'
USING jar 'dbfs:/FileStore/jars/decryptUDF.jar';
但如果我尝试调用它,则会引发错误:
%sql
SELECT default.udfDecrypt(field, 'key') FROM default.encrypted_test;
Error in SQL statement: AnalysisException: Can not load class 'com.nm.udf.udfDecrypt' when registering the function 'default.udfDecrypt', please make sure it is on the classpath; line 1 pos 7
我注意到可以使用任何 jar 文件路径(甚至是不存在的路径)声明该函数,它仍然会返回“OK”。
我正在使用适用于 Azure 的 Databricks。
【问题讨论】:
你能验证 jar 是否存在于 dbfs 路径中吗? 是的,刚刚重新检查过。 【参考方案1】:您的 UDF 代码似乎丢失了:
package com.nm.udf;
在顶部。
【讨论】:
成功了!谢谢!以上是关于注册函数时Databricks SCALA UDF无法加载类的主要内容,如果未能解决你的问题,请参考以下文章
任务在 Databricks 上的 Scala 中不可序列化
我们如何在 Spark-Scala 和 Cataloging UDF 中注册一个函数以及其他函数?
从 Scala 将 UDF 注册到 SqlContext 以在 PySpark 中使用