UDAF--版本从2.3.2升级到2.3.4 或者2.4后线上运行的UDAF运行异常

【详述】版本从2.3.2升级到2.3.4 或者2.4后线上运行的UDAF运行异常
文件是min_by的java实现
MinBy2.java (2.0 KB)

麻烦贴下报错信息和相关的错误截图,谢谢!

和这个差不多 这是另外一个聚合函数的 min_by是63行报错


2.3.2的时候是可以运行的对吧

是的 线上是2.3.2 是正常运行的

能简化下最小的复现场景么。比如建表和查询调用函数的sql,我们复现下

把min_by那个merge里面 <= 去了试试,应该是写的不对。低版本是恰好撞上去了,可以运行

那是我们的业务处理逻辑 是必须的判断

集群环境 数据量足够大 任何表都行;
sql: select min_by({vachar_column},{long_column}) from table 就可以

这个是UDF写的问题,得改UDF,参考一下我们提供的example,之前用的<=是不规范的。

这个函数的业务就是根据第二个值的最小值,返回对应的第一个值; long类型的比较 用<= 不规范 指的是什么,可以说明下吗 谢谢!样例(文档是提供的样例)中没有看到做比较的逻辑

我们也碰到了类似问题
看了回复。同样不是很理解这里的<=判断不规范是指什么? 可以具体说一下嘛
这里只是业务逻辑的判断吧,通过比较 buffer 中的bufftime 和原 state 中的time 值,来判断是否要更新后面的取值。

我们在预研starrocks,2.3.2 的版本中 出现了跑udaf 导致be崩溃的问题,看问题在2.4.2 中解决了。但是升级后 出现了这篇同样的问题。麻烦帮忙看一下吧

所有序列化之后的值,在反序列化阶段都需要读出来。比如我某条记录序列化的时候写了10byte,那么我发序列化的时候必须读10byte,否则剩下的内容就会被下一条数据读取

按照您的提示 我们测试下哈 虽然还是有疑问

已经按照你说的做了代码修改:

但是其中输出的日志不太明白:

1.同一查询State#serializeLength()返回值是固定的–本例中是44, 为什么会出现capacity成倍上涨的情况呢
2. 对于这种State#serializeLength()返回值是固定的的逻辑,还可以获取buffer中的有效值,但是对于漏斗这种逻辑,怎么实现从buffer中获取有效值呢
3. 104行有 buffer.capacity() == buffer.position()的判断,因为在之前的测试中有发现,会有传入的buffer中有buffer.capacity() == buffer.position()的情况