在SQL中注册Spark UDAF

时间:2019-05-08 17:25:33

标签: apache-spark apache-spark-sql

在线上有很多关于如何定义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服务器。

0 个答案:

没有答案