定制化开发事故案例——报表查询groupby原创
9人赞赏了该文章
1,589次浏览
编辑于2023年12月14日 10:54:14
一、关键词
报表、algo、groupby
二、项目背景
某定制化开发项目发现一业务报表跨多月查询会报错“报表查询错误:field null as 字段 not found”。该问题在本地开发环境无法复现。重新多次部署元数据和代码确认版本一致,仍然无法解决问题。最后通过部署日志跟踪发现问题竟然是group by使用不正确导致
三、反面真实代码案例(错误示范,不要模仿!!!!!)
group by只支持字段,还不支持表达式和函数!
错误点:
可以看到groupby函数里使用了"null as 字段"的语法
//3、根据字段分组求出小计合计 ,fiedls[ ]是字段数组 DataSet finish = ds.groupBy(new String[]{fields[0], fields[1], fields[3], fields[4], "null as 字段A","null as 字段B","null as 字段C", fields[8], fields[9],....).sum(fields[10]).sum(fields[11])....finish();
四、影响范围
1、影响客户业务报表功能使用,跨月查询报异常
2、开发环境无法复现问题,导致客户现场开发没办法确定问题原因
3、发现问题——解决问题,这中间消耗了很长时间,问题定位比较困难
五、原理解析
往groupby里写表达式,开发环境没有报错,导致初期排查方向被误导为元数据或代码没有同步
主要原因是:
groupby在小数据量处理时,会往内存里写所以该表达式“null as 字段”会执行成功,而当数据量达到一定程度时,为了避免OOM,平台会让groupby往硬盘里写数据,这个时候表达式和函数不支持往硬盘里写数据,这个时候报表就会报错not found!
同样有这个问题还有orderby方法!
六、改正方案(重要!!!!!!)
不要往groupby里写表达式!null as 表达式可以用addNullField方法替代!代码如下
DataSet finish = ds.groupBy(new String[]{fields[0], fields[1], fields[3], fields[4],.......}) .sum(fields[10]).sum(fields[11]).....finish() .addNullField("字段A").addNullField("字段B").addNullField("字段C");
赞 9
9人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读