首页 > 解决方案 > 在 SQL 中注册 Spark UDAF

问题描述

网上有很多关于如何定义和注册 UDAF 的文档,但我没有看到任何使用 SQL 的示例。例如,假设我定义了一个自定义 UDAF:

import org.apache.spark.sql.expressions.UserDefinedAggregateFunction    

class MyUDAF extends UserDefinedAggregateFunction {
  ...
}

我知道您可以编译 jar,将其添加到 Spark 类路径,然后注册并与 scala API 一起使用:

$SPARK_HOME/bin/spark-shell  --jars my-udaf.jar
> spark.udf.register("myUDAF", new MyUDAF)
> spark.sql("select myUDAF(column) from ...")

在 SQL API 中,有CREATE FUNCTION,但根据期望 Hive UDF/UDAF 而不是 Spark 的文档。也就是说,UDAF 应该是 的子类org.apache.hadoop.hive.ql.exec.hive.UDAF,而不是 Spark 的UserDefinedAggregateFunction. 事实上,如果我尝试,那么我会收到以下错误:

spark-sql> CREATE FUNCTION myUDAF AS 'MyUDAF';
spark-sql> select myUDAF(column) from blah;
Error in query: No handler for Hive UDF 'MyUDAF'; line 1 pos 7

SQL 和 Scala API 会以不同的方式对待 UDAF 注册,这似乎很奇怪。有没有办法使用 SQL API 注册 Spark UDAF? CREATE FUNCTION似乎不起作用。

最终,我要做的是向 Spark thrift 服务器注册一些 UDAF,并在服务器启动时自动注册它们。可能有不同的方法。例如,本文使用 Scala 类而不是start-thriftserver.sh.

标签: apache-sparkapache-spark-sql

解决方案


推荐阅读