Spark hive udf:用于UDAF分析异常的交易

问题描述 投票:1回答:1

创建了一个项目'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
  }

建造它并为它创造罐子。试图在另一个火花程序中使用这个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)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.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)at org.apache.spark.sql.catalyst.catalog .sessionCatalog.lookupFunction(SessionCatalog.scala:1247)at org.apache.spark.sql.catalyst.analysis.Analyzer $ ResolveFunctions $$ anonfun $ apply $ 16 $$ anonfun $ applyOrElse $ 6 $$ anonfun $ applyOrElse $ 52.apply(Analyzer。 scala:1226)at org.apache.spark.sql.catalyst.analysis.Analyzer $ ResolveFunctions $$ anonfun $ apply $ 16 $$ anonfun $ applyOrElse $ 6 $$ anonfun $ applyOrElse $ 52.apply(Analyzer.scala:1226)at org。 apache.spark.sql.catalyst.analysis.package $ .withPosition(package.scala:48)

对此有任何帮助非常感谢。

scala apache-spark hive pyspark spark-hive
1个回答
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函数仅扫描用户定义的聚合函数。如果函数不是UDAF,则无法找到它。

创建Jira task来实现这一点

© www.soinside.com 2019 - 2024. All rights reserved.