В Интернете достаточно документации по определению UDAF и его регистрации, но я не видел ни одного примера использования SQL.Например, допустим, я определил пользовательский UDAF:
import org.apache.spark.sql.expressions.UserDefinedAggregateFunction
class MyUDAF extends UserDefinedAggregateFunction {
...
}
Я понимаю, что вы можете скомпилировать jar, добавить его в путь к классам Spark, зарегистрировать и использовать его с API-интерфейсом scala:
$SPARK_HOME/bin/spark-shell --jars my-udaf.jar
> spark.udf.register("myUDAF", new new MyUDAF)
> spark.sql("select myUDAF(column) from ...")
В API SQL есть 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
Кажется странным, что API SQL и scala будут относиться к регистрации UDAF по-разному. Есть ли способ зарегистрировать UDAF Spark с использованием SQL API? CREATE FUNCTION
, похоже, не работает.
В конечном итоге я пытаюсь зарегистрировать некоторые UDAF в Sparkбережливый сервер и зарегистрировать их автоматически при запуске сервераТам может быть другой подход.Например, эта статья запускает экономичный сервер, используя класс Scala вместо start-thriftserver.sh
.