如何在spark SQL中注册Scala UDF,而不是spark Scala?

如何在spark SQL中注册Scala UDF,而不是spark Scala?,scala,hive,apache-spark-sql,Scala,Hive,Apache Spark Sql,看起来常规的配置单元语句应该可以工作。在我运行的script.sql中,sparksql--jars mylib.jar myscript.sql CREATE TEMPORARY FUNCTION rank AS 'com.mycompany.udf.Custom.rankFunc'; ... CREATE TEMPORARY VIEW MyTable AS ( SELECT rank(id) AS rank, ... 在Sca

看起来常规的配置单元语句应该可以工作。在我运行的script.sql中,
sparksql--jars mylib.jar myscript.sql

CREATE TEMPORARY FUNCTION rank AS 'com.mycompany.udf.Custom.rankFunc';

...
CREATE TEMPORARY VIEW MyTable AS (
    SELECT
       rank(id)  AS rank,
       ...            
在Scala代码(mylib.jar)中:

但是,配置单元代码没有看到此函数

18/01/23 17:38:25 ERROR SparkSQLDriver: Failed in [
CREATE TEMPORARY FUNCTION rank AS 'com.mycompany.udf.Custom.rankFunc']
java.lang.ClassNotFoundException: com.mycompany.udf.Custom.rankFunc
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)

我应该如何更改Scala库中的代码?

因为有很多困惑,我正在更新我的答案:

以下是md5 jave代码的代码:

package org.apache.hadoop.hive.ql.udf;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.io.Text;

public class UDFMd5 extends UDF {
  private final Text result = new Text();
  /**
   * Convert String to md5
   */
  public Text evaluate(Text n) {
    if (n == null) {
      return null;
    }
    String str = n.toString();
    String md5Hex = DigestUtils.md5Hex(str);
    result.set(md5Hex);
    return result;
  }  
}
我使用了蜂箱中使用的同一个罐子,并且能够使它工作:

这对我很有用:

在我使用的蜂箱中:

将临时函数md5创建为 使用JAR的“org.apache.hadoop.hive.ql.udf.UDFMd5” '/test/balaram/hive-MD5.jar

在Spark中,我使用了:

将临时函数md5创建为 'org.apache.hadoop.hive.ql.udf.UDFMd5'


如果这没有帮助,很抱歉,您会遇到此错误,因为配置单元希望函数是类,而不是方法名

将Scala代码(UDF)更改为:

。。。和SQL脚本,以:

CREATE TEMPORARY FUNCTION rankFunc AS 'com.mycompany.udf.RankFunc'
...

以下是如何使用和创建自定义自定义自定义项的示例。

是的,我知道如何使用Spark。我的问题是关于spark-sql的。启动spark-sql时需要包括jar。您可以像下面这样使用:创建临时函数myFunnyUpper作为“org.hue.udf.MyUpper”右键。这就是我在上面代码中所做的。另外,我在问题中使用了一个jar-updated。但它不起作用。我已经编辑了上面的帖子来展示我是如何使它起作用的。你能澄清一下吗?在哪里运行
sqlContext.udf.register(“customudf”,…)
?我的jar中没有
main()
package com.mycompany.udf

class RankFunc extends org.apache.hadoop.hive.ql.exec.UDF {
  def evaluate(id: Long): Double = { Rank(id).rank }
}
CREATE TEMPORARY FUNCTION rankFunc AS 'com.mycompany.udf.RankFunc'
...