如何在spark SQL中注册Scala UDF,而不是spark Scala?
看起来常规的配置单元语句应该可以工作。在我运行的script.sql中,如何在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
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'
...