Hi Marco,

nesting aggregated functions is not allowed in SQL. The exception could be improved though. I guess the planner searches for a scalar function called `MyUDTAGG` in your example and cannot find one.

Maybe the built-in function `COLLECT` or `LISTAGG`is what you are looking for?

https://ci.apache.org/projects/flink/flink-docs-release-1.12/dev/table/functions/systemFunctions.html

Regards,
Timo


On 05.01.21 14:45, Marco Villalobos wrote:
  I am trying to use User defined Table Aggregate function directly in the SQL 
so that I could combine all the rows collected in a window into one object.

GIVEN a User defined Table Aggregate function

public class MyUDTAGG extends 
TableAggregateFunction<PurchaseWindow,PurchaseWindow> {

        public PurchaseWindow createAccumulator() {
                return new PurchaseWindow();
        }

        public void accumulate(PurchaseWindow acc, String name, double cost) {
                acc.add(name, cost);
        }

        public void emitValue(PurchaseWindow acc, Collector<PurchaseWindow> 
out) {
                out.collect(acc);
        }
}

THAT it is registered as

StreamTableEnvironment tEnv = ...
tEnv.registerFunction("MyUDTAGG", new MyUDTAGG());

THEN is it possible to call it in an SQL query in this manner?

SELECT MyUDTAGG(name, SUM(cost)) AS purchase_window
FROM purchases
GROUP BY TUMBLE(proactive, INTERVAL '1' DAY), name


I am receiving an SQL validation error, "No match found for function signature 
...".

What am I doing wrong, or is there a better way to do this?




Reply via email to