注册函数时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 和 Spark UDF 函数

从 Scala 将 UDF 注册到 SqlContext 以在 PySpark 中使用

Azure Databricks Scala:如何替换相应层次结构之后的行

Spark 2.1 注册UDF到functionRegistry