文章目录
收起
支持聚合函数STDDEV
背景
OpenMLDB 尚未支持内置的标准差聚合函数 STDDEV,在这个任务中,你将参照我们的内置聚合函数开发流程,实现一个 STDDEV 的聚合函数。 准备知识:
- 标准差 STDDEV 定义:https://en.wikipedia.org/wiki/Standard_deviation#Discrete_random_variable
- 内置聚合函数的开发流程https://openmldb.ai/docs/zh/main/developer/built_in_function_develop_guide.html
编程语言
C++
实现方案
语法定义
STDDEV(<expr>)
举例:SELECT STDDEV(col1) OVER w1 FROM t1 WINDOW w1 AS (PARTITION BY col0 ORDER BY col2 ROWS BETWEEN 2 PRECEDING AND CURRENT ROW);
整体流程
整体流程与其他聚合函数(例如DISTINCT_COUNT)相似,参数和其他数据库实现保持一致,即 stddev(
- 实现 StdDev 类,定义 Init, Update, Output 函数
- 通过 RegisterUdaf 注册 stddev 函数
- 补充 UT 对新增的 STDDEV 聚合函数进行测试
注意事项
STDDEV 和其他聚合函数主要不同的地方在于 STDDEV 需要对窗口数据读两次,即第一次读取用来计算平均数;第二次读取用来计算标准差。
但是对于自定义聚合函数接口,我们只能通过 Update 接口读到当前值,所以我们只能读到一遍数据。为了可以读第二次数据,我们可以通过数组来存储读到的所有数据,在 Output 函数里进行第二遍数据的读取,计算标准差。
GitHub Issue