百万级分组大报表开发与呈现

简介:

在《秒级展现的百万级大清单报表怎么做》中,我们介绍了无论 RDB 还是非 RDB,润乾报表都能够通过异步线程实现秒级海量大清单报表(以下简称:大报表)。实际业务中,除了查询明细,有时还要展现全量汇总数据,或者查询分组明细和计算分组汇总。本文就将介绍这些带有汇总和分组的大报表的开发方法。

带汇总的大报表
       在大报表中计算汇总值与常规报表基于报表内数据进行的汇总不同,大报表由于采用异步线程,因此无法通过报表内数据进行汇总(因为每次只能取到部分数据),只能在数据处理阶段计算汇总值并交给报表呈现。

我们还是使用《秒级展现的百万级大清单报表怎么做》中 SQL 源大报表的例子,现在需要在每页最后一行显示订单汇总情况(订单数量、订单总额、运费总额)。
00

制作报表模板
       增加一个数据集 ds2 计算汇总值:
11

 报表中最后一行引入 ds2 汇总值进行呈现,这里为了每页都包含汇总数据,设置最后一行属性为报表尾。
22

   当然,带有汇总的大报表性能跟计算汇总值的 SQL 执行效率强相关,所以可能会发现带有汇总的大报表要比单纯查询明细慢一些。

分组大报表
       实际业务中,简单呈现大报表清单往往还不够,有时还需要对海量数据进行分组,呈现汇总及明细情况。下面,我们就以订单数据为例,查询一下按地区分组的明细及订单金额汇总。

需求分析
       首先,需要呈现分组明细的报表无法在数据源端进行聚合,例如通过 SQL 聚合后就不包含分组明细了,除非再查询一次进行拼接,但查询两次显然会严重影响性能。因此我们需要尽量将明细数据读出后在应用端进行分组聚合。

   那问题就来了,由于海量数据要通过分批读取的方法进行呈现,如何保证读取的每批分组数据是完整的?如果分组数据不完整,分组聚合的结果显然也就不正确了。因此,除了要保证能在应用端实现聚合,还要保证批量读取数据时分组数据的完整性。

   下面就是润乾报表结合集算器(数据集)实现分组大报表的过程。

报表数据准备
       我们需要编写集算器 SPL 脚本进行数据准备。这里,我们要编写两个 SPL 脚本,分别实现:查询分组明细并计算汇总,以及通过游标分批为报表返回结果集。

SPL 脚本 1:group-detail.dfx
设置脚本参数:
33

编写 SPL 脚本:
1

SPL 解析:

1、 A2 查询数据库,SQL 中指定按照分组字段(货主地区)排序,以便后续可以每次取出整个分组进行汇总。为此需要在排序字段上建立索引,避免全表排序时间过长。

2、 A3 循环游标,以货主地区为标记,保证每次读取的记录数为一个地区数据

3、 B4 增加标志位,用于后续报表展现中突出汇总行。标志为 0 时表示是明细记录

4、 B5 针对每个分组进行汇总

5、 B6 将分组值追加到明细记录中,标志设为 1,表示是汇总记录

6、 B7 返回分组明细和汇总集合。注意这里 return 写在循环内,因此会多次返回分组集合

关于 for cs,n;x 用法
在集算器 SPL 脚本中,for cs,n;x 表示针对游标 cs 通过循环遍历数据,每轮从游标读取 n 条记录或者直到记录中的 x 发生变化,循环全部结束后关闭游标。大数据量的分组取数是这种循环的常用之处。如果省略了 n 和 x,那就简单地返回游标中所有数据并关闭游标。函数的具体说明可以参考:http://doc.raqsoft.com.cn/esproc/func/forcsnx.html

   当大数据集按照分组字段有序时,这种取数方式每次可以读取一个完整分组到内存中参与计算,不过这时仍然要求分组不能很大(内存能装下)。而在金融和电信行业中,经常要基于单用户做数据分析,也就是按用户分组,而每个用户的流水记录规模又较大,常规的拆分方法作起来十分复杂。而通过集算器就可以很好地解决这类问题了。

 

SPL 脚本 2:main.dfx
设置脚本参数:
44

编写 SPL 脚本:
2

前一个 SPL 脚本 group-detail.dfx 解决了分组查询明细并汇总计算的问题。这个脚本 main.dfx 则可以分批次取数并提供给润乾报表,从而实现异步大报表呈现。脚本中 A1 通过 cursor 函数直接调用前一脚本生成游标,由 A2 将游标返回给报表。

关于 cursor() 函数
       使用 cursor 函数调用 SPL 脚本生成游标时,被调用的 SPL 脚本可以有多个返回结果集(例如在 for 循环中的多个 return),而游标取数(fetch)时可以依次使用多个 return 结果,无需等待所有结果集都准备好再使用,原理如下图所示。函数的具体说明可以参考:http://doc.raqsoft.com.cn/esproc/func/cursordfx.html
55

结合大报表使用 cursor() 函数运行原理

设计报表模板
设置报表参数,查询起止日期:
66

设置数据集引用 main.dfx 并传递日期参数:
77

   按照大报表模板设计思路,编写表达式
88

为了将汇总行高亮显示出来,这里利用了数据准备阶段增加的标志位 flag 列,当 flag 值为 1 的时候代表该行为汇总行,设置背景色表达式:if(A3==1,-3355444)

设置大数据集
99

发布到 WEB
       将做好的模板发布到 WEB 端,效果如下:
10

当然,标志位 flag 列也可以设置为隐藏。

效果调整
       调整报表模板,将标志位 flag 列隐藏,并设置 B3 格的扩展属性 同值合并为“纵向合并”
12

展现时分组列则带有合并格的效果:
13

注意事项
       在《秒级展现的百万级大清单报表怎么做》中,我们提示了大报表不要全表排序,也不适合高并发场景。除此以外,对于带有分组汇总和明细的大报表还应该注意:

单个分组不宜过大
       由于计算分组明细和汇总值时需要将某一个分组数据全部加载到内存中进行计算,因此分组相对内存容量不宜过大,从而确保单个分组数据能进行全内存计算。

作者:lisongbo
链接:http://c.raqsoft.com.cn/article/1536328795758
来源:乾学院
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章
|
3天前
|
消息中间件 存储 缓存
十万订单每秒热点数据架构优化实践深度解析
【11月更文挑战第20天】随着互联网技术的飞速发展,电子商务平台在高峰时段需要处理海量订单,这对系统的性能、稳定性和扩展性提出了极高的要求。尤其是在“双十一”、“618”等大型促销活动中,每秒需要处理数万甚至数十万笔订单,这对系统的热点数据处理能力构成了严峻挑战。本文将深入探讨如何优化架构以应对每秒十万订单级别的热点数据处理,从历史背景、功能点、业务场景、底层原理以及使用Java模拟示例等多个维度进行剖析。
22 8
|
18天前
|
SQL 存储 算法
优化银行预计算固定查询成实时灵活查询
W银行指标查询系统用于计算和展示各类汇总指标,支持银行经营决策。因数据量庞大,系统采用预计算方式,但随着指标数量激增,预计算方式逐渐成为瓶颈。文章详细介绍了系统面临的挑战及优化方案,包括列式存储、有序归并、多线程计算等技术,最终实现了从明细数据实时计算指标的目标,显著提升了系统性能。
|
3月前
|
SQL 缓存 数据挖掘
数据平台问题之复合指标生成中维度能力如何处理
数据平台问题之复合指标生成中维度能力如何处理
|
5月前
|
消息中间件 监控 druid
思源:秒级体验百亿级数据量监控钻取
思源:秒级体验百亿级数据量监控钻取
|
关系型数据库 分布式数据库 PolarDB
沉浸式学习PostgreSQL|PolarDB 15: 企业ERP软件、网站、分析型业务场景、营销场景人群圈选, 任意字段组合条件数据筛选
本篇文章目标学习如何快速在任意字段组合条件输入搜索到满足条件的数据.
610 0
|
存储 缓存 NoSQL
关于海量级存储用户标签体系架构
关于海量级存储用户标签体系架构
384 0
关于海量级存储用户标签体系架构
|
SQL 消息中间件 Java
百万级数据excel导出功能如何实现?
这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享一下,希望对你会有所帮助。 原始需求:用户在UI界面上点击全部导出按钮,就能导出所有商品数据。
628 0
百万级数据excel导出功能如何实现?
|
SQL 算法 Java
百万级别数据Excel导出优化
这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出。
930 0
百万级别数据Excel导出优化
|
数据采集 大数据 开发者
离线数据计算-国际查询转换率及其他|学习笔记
快速学习离线数据计算-国际查询转换率及其他
164 0