5

创建了一个项目“spark-udf”并编写了 hive 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。试图在另一个火花程序中使用这个 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

例外:

线程“主”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) at org.apache.spark.sql.catalyst.catalog.SessionCatalog$$anonfun$org$apache$spark$sql$catalyst$catalog $SessionCatalog$$makeFunctionBuilder$1.apply(SessionCatalog.scala:1085) at org.apache.spark.sql.catalyst.analysis.SimpleFunctionRegistry.lookupFunction(FunctionRegistry.scala:115) at org.apache.spark.sql.catalyst.catalog .SessionCatalog。

非常感谢您对此的任何帮助。

4

2 回答 2

2

正如评论中提到的,最好编写 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,并且仅makeFunctionExpressionSessionCatalog扫描用户定义的聚合函数时起作用。如果函数不是 UDAF,则不会被找到。

创建了Jira 任务来实现这个

于 2018-09-04T16:26:32.273 回答
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
  }
}
于 2021-04-06T04:14:58.407 回答