Spark hive udf: нет обработчика для исключения анализа UDAF - PullRequest
0 голосов
/ 04 сентября 2018

Создан один проект «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
  }

Построил и создал банку для него. Пытался использовать этот udf в другой программе 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 (...); линия 1 поз 7 в org.apache.spark.sql.catalyst.catalog.SessionCatalog.makeFunctionExpression (SessionCatalog.scala: 1105) в org.apache.spark.sql.catalyst.catalog.SessionCatalog $$ anonfun $ орг $ апач $ искрой $ SQL $ Катализатор $ каталог $ SessionCatalog $$ makeFunctionBuilder $ 1.Apply (SessionCatalog.scala: 1085) в org.apache.spark.sql.catalyst.catalog.SessionCatalog $$ anonfun $ орг $ апач $ искрой $ SQL $ Катализатор $ каталог $ 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 $ применяются $ 16 $$ anonfun $ applyOrElse $ 6 $$ anonfun $ applyOrElse $ 52.apply (Analyzer.scala: 1226) в org.apache.spark.sql.catalyst.analysis.Analyzer $ ResolveFunctions $$ anonfun $ применяются $ 16 $$ anonfun $ applyOrElse $ 6 $$ anonfun $ applyOrElse $ 52.apply (Analyzer.scala: 1226) в org.apache.spark.sql.catalyst.analysis.package $ .withPosition (package.scala: 48)

Любая помощь в этом деле очень ценится.

1 Ответ

0 голосов
/ 04 сентября 2018

Как уже упоминалось в комментариях, лучше написать 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 для реализации этого

...