【问题标题】:No handler for UDF/UDAF/UDTF - Spark UDF3没有 UDF/UDAF/UDTF 的处理程序 - Spark UDF3
【发布时间】:2022-04-14 23:38:03
【问题描述】:

Java 代码 -

package ClusterAlgoCall2;

import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.api.java.UDF3;
import org.apache.spark.sql.types.DataTypes;

public class ClusterAlgocall_Main3 {
    public static void main(String[] args) {
    SparkSession spark = SparkSession.builder().appName("someappname").enableHiveSupport().getOrCreate();

    UDF3 UDFCosinetoTxt = new UDF3<String, String, String, String>() {
        public String call(String col1, String col2 , String col3) throws Exception {
            return col3  ;
        }
    };
    spark.udf().register("UDFCosinetoTxt", UDFCosinetoTxt, DataTypes.StringType);
}
}

构建它并为它创建一个罐子。尝试在 spark-SQL 中使用这个 jar 使用 -

创建临时函数后
add jar s3://xxxx/jar/ClusterAlgoCall2.jar ;
CREATE TEMPORARY FUNCTION ClusterAlgo as 'ClusterAlgoCall2.ClusterAlgocall_Main3' using jar 's3://xxxx/jar/ClusterAlgoCall2.jar';

运行查询时出错 -

select ClusterAlgo2(col1,col2,col3) from clusteralgo_test ;
Error in query: No handler for UDF/UDAF/UDTF 'ClusterAlgoCall2.ClusterAlgocall_Main3'; line 1 pos 7

【问题讨论】:

  • 嗨@aggrawalnikhil02,您找到解决方案了吗?我也有同样的问题。。

标签: java apache-spark hive apache-spark-sql


【解决方案1】:

要创建 UDF,Java 类需要遵循特定的模式。 根据documentation,实现类应该扩展基类之一:

class_name

指定为要创建的函数提供实现的类的名称。实现类应扩展基类之一,如下所示:

  • 应该在org.apache.hadoop.hive.ql.exec 包中扩展UDF 或UDAF。
  • 应在org.apache.hadoop.hive.ql.udf.generic 包中扩展AbstractGenericUDAFResolver、GenericUDF 或GenericUDTF。
  • 应该在org.apache.spark.sql.expressions 包中扩展UserDefinedAggregateFunction。

因此,例如,您的类定义应如下所示:

import org.apache.hadoop.hive.ql.exec.UDF;

public class ClusterAlgocall_Main3 extends UDF { ... }

Here 就是一个例子。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2020-11-13
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多