spark配置单元udf:没有用于udaf分析异常的处理程序

2lpgd968  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(447)

创建了一个项目“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程序中使用此自定义项:

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.analysisexception中出现异常:udaf“com.spark.udf.uppercase”没有处理程序。改用sparksession.udf.register(…)。;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.analysis.analyzer$resolvefunctions$$anonfun$apply$16$$anonfun$applyorelse$6$$anonfun$applyorelse$52.apply(analyzer。scala:1226)在org.apache.spark.sql.catalyst.analysis.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)
非常感谢您的帮助。

hs1ihplo

hs1ihplo1#

如评论中所述,最好编写spark udf:

val uppercaseUDF = spark.udf.register("uppercase", (s : String) => s.toUpperCase)
spark.sql("select uppercase(Car) as NAME from cars").show

主要原因是你没有 enableHiveSupport 在创建sparksession期间。在这种情况下,将使用默认的sessioncatalog makeFunctionExpression 中的函数 SessionCatalog 只扫描用户定义的聚合函数。如果函数不是udaf,就找不到它。
创建jira任务来实现这个

相关问题