Scala Spark配置单元udf:没有UDAF分析异常的处理程序

Scala Spark配置单元udf:没有UDAF分析异常的处理程序,scala,apache-spark,hive,pyspark,spark-hive,Scala,Apache Spark,Hive,Pyspark,Spark Hive,创建了一个项目“spark udf”&编写了配置单元udf,如下所示: package com.spark.udf import org.apache.hadoop.hive.ql.exec.UDF class UpperCase extends UDF with Serializable { def evaluate(input: String): String = { input.toUpperCase } 构建它&为它创建jar。尝试在另一个spark程序中使用此udf

创建了一个项目“spark udf”&编写了配置单元udf,如下所示:

package com.spark.udf
import org.apache.hadoop.hive.ql.exec.UDF

class UpperCase extends UDF with Serializable {
  def evaluate(input: String): String = {
    input.toUpperCase
  }
构建它&为它创建jar。尝试在另一个spark程序中使用此udf:

spark.sql("CREATE OR REPLACE FUNCTION uppercase AS 'com.spark.udf.UpperCase' USING JAR '/home/swapnil/spark-udf/target/spark-udf-1.0.jar'")
但下面这句话给了我一个例外:

spark.sql("select uppercase(Car) as NAME from cars").show
例外情况:

线程“main”org.apache.spark.sql.analysis异常:否 UDAF“com.spark.udf.UpperCase”的处理程序。使用 而不是sparkSession.udf.register(…)。;第1行第7位置 org.apache.spark.sql.catalyst.catalog.SessionCatalog.makeFunctionExpression(SessionCatalog.scala:1105) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog$$anonfun$org$apache$spark$sql$catalyst$catalog$SessionCatalog$$makeFunctionBuilder$1.apply(SessionCatalog.scala:1085) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog$$anonfun$org$apache$spark$sql$catalyst$catalog$SessionCatalog$$makeFunctionBuilder$1.apply(SessionCatalog.scala:1085) 在 org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry.lookupFunction(FunctionRegistry.scala:115) 在 org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupFunction(SessionCatalog.scala:1247) 在 org.apache.spark.sql.catalyst.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6$$anonfun$applyOrElse$52.apply(Analyzer.scala:1226) 在 org.apache.spark.sql.catalyst.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6$$anonfun$applyOrElse$52.apply(Analyzer.scala:1226) 在 org.apache.spark.sql.catalyst.analysis.package$.withPosition(package.scala:48)


非常感谢您提供的任何帮助。

如评论中所述,最好编写Spark UDF:

val uppercaseUDF = spark.udf.register("uppercase", (s : String) => s.toUpperCase)
spark.sql("select uppercase(Car) as NAME from cars").show
主要原因是您在创建SparkSession期间未设置
enableHiveSupport
。在这种情况下,将使用默认的SessionCatalog,
SessionCatalog
中的
makeFunctionExpression
函数只扫描用户定义的聚合函数。如果函数不是UDAF,则不会找到它


创建以实现此问题的是类需要是公共的

package com.spark.udf
import org.apache.hadoop.hive.ql.exec.UDF

public class UpperCase extends UDF with Serializable {
  def evaluate(input: String): String = {
    input.toUpperCase
  }
}

为什么要编写一个用于Spark的hive UDF?如果您想在sparkI中使用spark UDF,最好定义一个spark UDF。您也尝试过spark UDF,但得到了相同的异常:import org.apache.spark.sql.api.java.UDF1 class大写扩展UDF1[String,String],并带有可序列化的{override def call(t1:String):String=t1.toUpperCase}如何将UDF jar添加到Spark程序中?@Philantrover我正在添加jar命令“创建或替换函数”使用jar'/home/swapnil/Spark-UDF/target/Spark-UDF-1.0.jar'@SwapnilChougule稍微改变了我的答案,创建或替换函数大写字母,请检查它-应该工作:)@Gaweda我也启用了配置单元支持。有了配置单元支持,配置单元udf可以正常工作。我想通过外部jar使用scala UDF。甚至我也观察到makeFunctionExpression只支持UDAF,而不支持UDF。这就是我所追求的。您已为此打开JIRA:)问题与spark 2.3.0有关。请用它测试一下。没有如上所述的处理程序。不知道最近的版本。您还可以检查相应的jira