![](/img/trans.png)
[英]How do we register a function in Spark-Scala and Cataloging UDF among the other functions?
[英]How to register Scala UDF in spark-SQL, not Spark-Scala?
看起來常規的Hive語句應該起作用。 在我通過spark-sql --jars mylib.jar myscript.sql
運行的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 }
....
}
但是,Hive代碼看不到此功能。
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庫中的代碼?
您收到此錯誤是因為Hive希望函數是類 ,而不是方法名。
將您的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'
...
因為有很多困惑,所以我正在更新我的答案:
這是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'/test/balaram/hive-MD5.jar創建臨時功能md5 AS'org.apache.hadoop.hive.ql.udf.UDFMd5';
在Spark中,我使用了:
創建臨時功能md5 AS'org.apache.hadoop.hive.ql.udf.UDFMd5'
如果這沒有幫助,對不起
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.