我想定义函数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
可以采用任意列类型并返回相同的类型。这就是为什么我认为我也应该能够做到这一点。
答案 0 :(得分:1)
不幸的是,Flink不支持具有灵活返回类型的聚合函数。对于MAX
函数,内部实现定义了与类型无关的核心逻辑,然后为每种受支持的类型(see code)创建一个实现。
然后,根据类型,内部将MAX
映射到正确的实现。
如果您将函数定义并注册为用户定义的聚合函数,我认为这是不可能的。