使用通用返回类型创建FlinkSQL UDF

时间:2020-05-26 17:07:02

标签: apache-flink flink-sql

我想定义函数T,该函数采用类型Number的值和类型T的排序参数,并根据排序(类型{{1})从窗口返回max元素}。我尝试过

public class MaxBy<T> extends AggregateFunction<T, Tuple2<T, Number>> {

    @Override
    public T getValue(Tuple2<T, Number> tuple) {
        return tuple.f0;
    }

    @Override
    public Tuple2<T, Number> createAccumulator() {
        return Tuple2.of(null, 0L);
    }

    public void accumulate(Tuple2<T, Number> acc, T value, Number order) {
        if (order.doubleValue() > acc.f1.doubleValue()) {
            acc.f0 = value;
            acc.f1 = order;
        }
    }
}

但是我无法使用TableEnvironment.registerFunction注册这种功能。在Flink的下面使用TypeInformation来匹配SQL查询中的类型,并且在这样的定义下,它无法确定类型(至少我是这样认为的)。我看到可以提供几个accumulate函数,但仍然-我认为每个重载方法的返回类型都必须相同。

内置的聚集函数的工作方式与我要实现的类似-MAX可以采用任意列类型并返回相同的类型。这就是为什么我认为我也应该能够做到这一点。

1 个答案:

答案 0 :(得分:1)

不幸的是,Flink不支持具有灵活返回类型的聚合函数。对于MAX函数,内部实现定义了与类型无关的核心逻辑,然后为每种受支持的类型(see code)创建一个实现。

然后,根据类型,内部将MAX映射到正确的实现。

如果您将函数定义并注册为用户定义的聚合函数,我认为这是不可能的。