如何在sparksql中注册scala自定义项,而不是sparkscala?

oxiaedzo  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(323)

看来一个常规的Hive语句应该能起作用。在我运行的script.sql中 spark-sql --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)中:

package com.mycompany.udf

...

object Custom {
def rankFunc(id: Long): Double = { Rank(id).rank }
....
}

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

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库中的代码?
ep6jt1vc

ep6jt1vc1#

因为有很多困惑,我正在更新我的答案:
以下是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;
  }  
}

我拿了 hive 里用的jar,能让它工作:

这对我很有用:

在我用过的 hive 里:
使用jar'/test/balaram/hive-md5.jar创建临时函数md5作为'org.apache.hadoop.hive.ql.udf.udfmd5';
在我使用的spark中:
将临时函数md5创建为“org.apache.hadoop.hive.ql.udf.udfmd5”
如果这没用,我很抱歉

gzjq41n4

gzjq41n42#

出现此错误是因为配置单元希望函数是类,而不是方法名。
将scala代码(udf)更改为:

package com.mycompany.udf

class RankFunc extends org.apache.hadoop.hive.ql.exec.UDF {
  def evaluate(id: Long): Double = { Rank(id).rank }
}

... 和sql脚本:

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

下面是如何使用java和scala创建自定义udf的示例。

相关问题