用润乾集算报表实现实时报表(T+0)的方案,报表实时
在报表项目中,客户越来越关注源数据的实时性,希望看到最新发生的数据在报表中体现出来。但是,传统的报表工具+数据仓库+ETL方式很难做到这一点,往往是只能看到昨天、上周甚至是上个月的情况,也就是T+1、T+7、T+30统称T+n报表。很难实现T+0报表,也就是能体现实时信息的报表。
分析其原因在于:1、如果报表的历史数据和最新数据都从客户的生产系统读取,虽然可以实现T+0报表,但是会对生产数据库造成压力,影响客户的业务。2、如果采用数据仓库的方式,那么ETL从生产库中取出数据,需要较长的“窗口时间”,一般是客户下班之后,到第二天早上上班之前,所以客户能看到的最新数据也只能是T+1。3、虽然理论上可以从历史库中和生产库中同时取数据形成实时报表,但是一般的报表工具都不具备跨库取数计算能力,其他的跨库计算方案又比较复杂,很难实施。
可以考虑采用润乾集算报表提供的T+0报表方案,利用集算报表的混合数据源能力实现低成本的实时报表。实现思路是:把不会发生变动的大量历史数据采用数据文件存储,少量新数据从生产库读取,在保证报表实时性的同时,降低了历史数据存储的成本,减少了报表系统造成的生产数据库的负载。传统T+n方案和集算报表T+0方案结构对比示意图如下:
上图润乾计算报表结构中“导出(非实时)”是指在非工作时间(例如晚上),将生产数据库新增数据同步到历史数据的数据文件中。具体实现是采用润乾集算器提供的命令行执行方式,配合操作系统定时任务方式,详见集算器教程。
这里通过“各州销售统计表”来说明一下润乾集算报表T+0方案的具体做法,报表如下:
上图报表中的历史销售数据量很大,来自于数据文件。同时,为了保证报表的实时行,当天的少量数据直接从生产数据库(db2)取出。
具体实现步骤如下:
第一步,在集算器中编写集算脚本sales-state.dfx。
A1:连接预先配置好的生产数据库(db2)。
A2:建立数据库游标,用简单的sql读取销售数据和销售人员的数据。从where条件中的days(current date)=days(orderdate)可以看到,销售数据仅仅读取当天的新数据。
A3:建立预先导出好的数据文件D:/files/sales/sales.b的游标。文件游标可以分批从比较大的数据文件中读取数据,避免出现内存溢出的情况。@b选项是指按照集算器提供的二进制编码来读取文件。
A4:将数据库游标(新数据)和文件游标(历史数据)纵向合并。
A5:利用groups函数,完成对合并后游标的分组汇总。
A6:按照销售总额的降序排列。
A7:关闭db2数据库连接。
第二步,在集算报表中建立db2数据源和集算数据集:
第三步:设计报表如下:
报表中的统计图具体制作方法参见集算报表教程。
需要说明的是,集算报表也支持数据采用其他的方式存储,比如mongodb、hdfs或者传统数据仓库。生产库中的新增数据可以用集算器导出,也可以用其他ETL工具导出。