AWS OpenSearch SQL查询偶发报错:can't evaluate on aggregator: sum
针对你遇到的SQL查询偶尔返回can't evaluate on aggregator: sum错误的问题,以下是具体排查思路和解决办法:
检查目标字段的数据类型一致性
核心原因大概率是_ingest.totalPrice字段存在非数值类型数据。当查询命中包含字符串、null或格式异常值的文档时,sum聚合无法正常执行。
排查:执行以下查询筛选目标时段的文档,验证字段类型和值:select `_ingest.totalPrice`, typeof(`_ingest.totalPrice`) from revenues WHERE `_uid`='1234' and ((millis>=1706745600000 and millis<=1717199999999) or millis=-1) limit 100解决:确保写入时
_ingest.totalPrice始终为数值类型,或在查询中过滤非数值数据:select `revenue` as `status`, sum(cast(`_ingest.totalPrice` as double)) as value, count(*) as count, date_format(receiptDate, 'y-MM') as aggDate, 'revenue' as type from revenues WHERE `_uid`='1234' and ((millis>=1706745600000 and millis<=1717199999999) or millis=-1) and typeof(`_ingest.totalPrice`) = 'double' GROUP by `status`, aggDate修正GROUP BY的别名引用逻辑
OpenSearch SQL对字段别名的解析可能存在偶发兼容性问题,尤其在旧版本插件中。你用revenue别名status后在GROUP BY中引用,可能触发解析歧义。
解决:将GROUP BY中的status替换为原始字段revenue:select `revenue` as `status`, sum(`_ingest.totalPrice`) as value, count(*) as count, date_format(receiptDate, 'y-MM') as aggDate, 'revenue' as type from revenues WHERE `_uid`='1234' and ((millis>=1706745600000 and millis<=1717199999999) or millis=-1) GROUP by `revenue`, aggDate验证插件与集群版本兼容性
旧版本SQL插件可能存在聚合逻辑的偶发bug,在复杂过滤+聚合场景下容易触发。
排查:执行GET _plugins/_sql/version查看插件版本,对照OpenSearch官方文档确认版本匹配度。
解决:若版本不兼容或存在已知bug,升级SQL插件到对应集群版本的最新兼容版。排查集群资源瓶颈
当集群CPU、内存不足时,聚合计算可能异常中断,返回此类错误。
排查:查看集群监控指标(CPU使用率、JVM内存、磁盘IO),确认错误出现时段是否存在资源过载情况。
解决:优化集群资源配置,或调整查询超时参数(通过request_timeout)避免计算中断。测试边界条件文档
查询中包含millis=-1的条件,可能命中特殊文档,这类文档的_ingest.totalPrice字段可能存在异常。
排查:单独执行select * from revenues where millis=-1 and _uid='1234'检查文档字段情况。
解决:若这些是无效数据,可直接从过滤条件中排除;若需保留,单独处理其字段值。
内容的提问来源于stack exchange,提问作者Deepak Goyal

