簡體   English   中英

如何在Spark-SQL中而不是Spark-Scala中注冊Scala UDF?

[英]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'
...

以下是有關如何使用JavaScala創建自定義UDF的示例。

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

這是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM