在线上有很多关于如何定义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 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旧式服务器上注册一些UDAF,并在服务器启动时自动注册它们。可能有不同的方法。例如,this article使用Scala类而不是start-thriftserver.sh
启动Thrift服务器。