apache-spark - 在 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
.
解决方案
推荐阅读
- android - QuickMatch onJoinedRoom 出现错误 2
- java - 如何在java中更改对象类型
- neo4j - 在 neo4j 中格式化时间持续时间
- selenium - 在 DDEV 容器中使用 Behat Drupal Extension 运行 selenium 测试
- java - 415 通过 REST 模板发送 json 文件时不受支持的媒体类型
- machine-learning - 如何在几天内训练神经网络?
- python - 无法移动文件python
- google-apps-script - 锁定预填充的 URL 字段
- android - 物理键盘在 Android 模拟器上输入错误的字符
- antlr - 解析包含点(。)的输入字符串未在 ANTLR 中得到验证