Swa*_*ule 5 hive scala apache-spark pyspark spark-hive
创建了一个项目“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
}
Run Code Online (Sandbox Code Playgroud)
构建它并为其创建 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'")
Run Code Online (Sandbox Code Playgroud)
但以下行给了我例外:
spark.sql("select uppercase(Car) as NAME from cars").show
Run Code Online (Sandbox Code Playgroud)
例外:
线程“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 org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$16$$anonfun$applyOrElse$6$$anonfun$applyOrElse$52.apply(Analyzer.SessionCatalog.lookupFunction(SessionCatalog.scala:1247) 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)
非常感谢任何有关此问题的帮助。
正如评论中提到的,最好编写 Spark UDF:
val uppercaseUDF = spark.udf.register("uppercase", (s : String) => s.toUpperCase)
spark.sql("select uppercase(Car) as NAME from cars").show
Run Code Online (Sandbox Code Playgroud)
主要原因是你enableHiveSupport在创建SparkSession时没有设置。在这种情况下,将使用默认的 SessionCatalog,并且仅在用户定义的聚合函数的扫描makeFunctionExpression中起作用SessionCatalog。如果函数不是 UDAF,则不会找到它。
创建Jira 任务来实现此目的
| 归档时间: |
|
| 查看次数: |
6016 次 |
| 最近记录: |