【数据蒋堂】报表应用的三层结构

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介:


在传统的报表应用结构中,报表工具一般都是与数据源直接连接,并没有一个中间的数据计算层。确实,大部分情况下的报表开发并不需要这一层,相关的数据计算在数据源和呈现环节分别处理就够了。不过,在开发过程中,我们发现,有一部分报表的计算既不适合在数据源也不适合在呈现环节实现,这类报表在数量上并不占多数,但耗用的开发工作量占比却很大。


有过程的计算


报表工具都可以完成计算列、分组排序等运算,有些报表工具还提供了跨行组运算和相对格与集合的引用方案,可以完成颇为复杂的运算。


不过,报表工具中的运算是一种状态式的计算,也就是把所有计算表达式写在报表布局中,根据依赖关系自动处理计算次序。这种方法很直观,在依赖关系不太复杂时能一目了然地了解各单元格的运算目标。但是,在依赖关系较为复杂,数据准备计算需要分成多步时,状态式计算就困难了。如果一定要在报表中实施过程式计算,常常需要借用隐藏格,而隐藏格不仅将破坏状态式运算的直观性,还会占用更多不必要的内存。


比如要列出销售额占前一半的大客户,如果不借助数据准备环节,就要在报表中使用隐藏行列手段将不该列出来的条目隐藏,而不能直接过滤掉。再比如带明细的分组报表要按汇总值排序,需要先分组后排序,许多报表工具无法控制这个次序。


还有个典型例子是舍位平衡,明细值四舍五入后再合计,可能会与合计值的四舍五入值不相等,会造成报表上明细与合计数值不一致,需要根据合计的舍入值倒推明细的舍入值,这种计算的逻辑并不复杂,但即便用了隐藏格也难以由报表工具完成。


多样性数据源


与多年前的单一数据源不同,现在有许多报表的数据源并不只来源于关系数据库,还可能是NoSQL数据库、本地文件、从WEB上传来的数据等。这些非关系数据库的数据源缺乏标准的数据获取接口和语法,有些甚至没有最基本的过滤能力。而计算报表时总还要进行一些过滤甚至关联运算,虽然报表工具一般都能提供这些计算能力,但由于都是内存计算,只适合于数据量较小的情况,数据量较大时就会导致容量负担过重。而且,大多数报表工具也不能很好地处理像json或XML这种多层数据,也没有灵活编码能力以登录远程WEB服务获取数据。


动态数据源也是常见的需求,报表工具使用的数据源一般是事先配置好的,不能根据参数动态选择,直接使用报表工具无法实现。报表被用于通用查询时,取数用的SQL不能简单地用参数控制条件,而经常可能要替换某个子句,有些报表工具支持宏替换,能够一定程度地解决这个问题,但根据参数计算宏值也是个有条件和过程的运算,直接在报表工具中很难完成。


性能优化问题


我们在往期的文章中曾谈到过,大多数情况的报表性能问题都需要在数据准备阶段来解决,其中有许多场景都不能在数据源内部处理。比如并行取数本来就是解决数据源IO性能问题,只能在数据源外部实现;可控缓存需要在外存写入缓存信息,也不能在数据源内部处理;清单列表中的异步数据缓存和按页取数的功能,都不是数据源本身提供的能力;即使可以在数据源环节处理的多数据集关联问题,在多数据库或非数据的场景、以及希望减轻数据库负担时,仍然需要在数据源外部解决。这些无法在数据源内部处理的场景,显然也无法在报表环节处理。


数据计算层


如果把传统报表应用结构的两层改成三层,增加一个中间的数据计算层,这些问题就容易解决了。



上述的各种运算都可以在数据计算层实现,报表工具只解决呈现问题以及少量适合状态式的直观计算即可。


其实,传统报表应用结构虽然没有刻意强调数据计算层,但仍然有这一层,只是比较隐蔽。典型的实现手段就是使用数据源中的存储过程或者在应用中使用报表工具的自定义数据源接口。存储过程能够解决一些过程式计算和性能优化问题,但它只能应用于单个数据库中,相当于在数据源内部的处理,对于必须在数据源外处理的场景无能为力,有较大的局限性。自定义数据源则在理论上可以解决上述所有问题,而且几乎所有报表工具都提供有这个接口,所以这种方式的应用更为广泛。


那么,使用报表工具的自定义数据源是否就可以方便地实现数据计算层呢?我们将在下一期讨论。



专栏作者简介

蒋步星,润乾软件创始人、首席科学家

清华大学计算机硕士,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016年,荣获中国电子信息产业发展研究院评选的“2016年中国软件和信息服务业十大领军人物”;2017年, 自主创新研发新一代的数据仓库、云数据库等产品即将面世。


数据蒋堂

《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。


原文发布时间为:2017-06-03

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关实践学习
基于MaxCompute的热门话题分析
Apsara Clouder大数据专项技能认证配套课程:基于MaxCompute的热门话题分析
相关文章
|
人工智能
AI背景颜色变成白色了怎么恢复灰色?
一些刚开始使用AI来做平面设计的朋友,有时候会突然工作界面变成白色,而设置里看了是灰色,然后怎样都调不回来了。贴吧里一篇文章介绍用CTRL+SHIFT+H,实际上这是隐藏画板的快捷键并没有解决问题。
AI背景颜色变成白色了怎么恢复灰色?
|
编译器 Linux C语言
编译并运行 Cython 代码的几种方式
编译并运行 Cython 代码的几种方式
580 2
|
11月前
|
关系型数据库 MySQL 数据库
mysql查看用户的过期时间
通过本文的介绍,希望您能够深入理解和掌握在MySQL中查看用户过期时间的方法,并在实际项目中灵活运用这些技术,提升数据库管理的安全性和效率。
761 3
|
8月前
|
消息中间件 人工智能 自然语言处理
基于 RocketMQ 事件驱动架构的 AI 应用实践
基于 RocketMQ 事件驱动架构的 AI 应用实践
294 2
|
8月前
|
Java Linux 网络安全
基于云服务器的数仓搭建-服务器配置
本文介绍了购置并配置三台云服务器的详细步骤。使用FinalShell连接服务器,并安装了必要的工具如epel-release、net-tools和vim。关闭防火墙后,在/opt目录下创建module和software文件夹,卸载默认JDK并修改主机名。添加环境变量路径/home/alpfree/bin,编写集群分发脚本xsync实现文件同步,配置无密登录,安装并分发JDK。参考资料来自海波老师的电商数仓课程。
|
SQL 关系型数据库 MySQL
文本----Navicat的快捷键,Navicate如何快速添加资料,选中整体一行,复制,文本排序可以在添加数据时,用一个qingge01简写就行
文本----Navicat的快捷键,Navicate如何快速添加资料,选中整体一行,复制,文本排序可以在添加数据时,用一个qingge01简写就行
|
算法 Java C语言
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
【数据结构】后缀(逆波兰)表达式的计算以及中缀转后缀的方法
2776 1
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
746 7
|
机器学习/深度学习 并行计算 PyTorch
使用PyTorch Profiler进行模型性能分析,改善并加速PyTorch训练
加速机器学习模型训练是工程师的关键需求。PyTorch Profiler提供了一种分析工具,用于测量CPU和CUDA时间,以及内存使用情况。通过在训练代码中嵌入分析器并使用tensorboard查看结果,工程师可以识别性能瓶颈。Profiler的`record_function`功能允许为特定操作命名,便于跟踪。优化策略包括使用FlashAttention或FSDP减少内存使用,以及通过torch.compile提升速度。监控CUDA内核执行和内存分配,尤其是避免频繁的cudaMalloc,能有效提升GPU效率。内存历史记录分析有助于检测内存泄漏和优化批处理大小。
1612 1
|
前端开发 Java API
构建强大的RESTful API:@RestController与@Controller的对比与应用
构建强大的RESTful API:@RestController与@Controller的对比与应用
267 0