Spark Hive udf:没有用于UDAF分析异常的处理程序

时间:2018-09-04 10:45:36

标签: 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.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(...)代替。第1行pos 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.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)

对此的任何帮助都非常感激。

2 个答案:

答案 0 :(得分:1)

如评论中所述,最好编写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,makeFunctionExpression中的SessionCatalog函数仅扫描用户定义的聚合函数。如果function不是UDAF,则找不到它。

创建了Jira task来实现此目的

答案 1 :(得分:0)

问题是课程需要公开。

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
  }
}