开发者社区> 润乾软件> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

让Birt报表脚本数据源变得既简单又强大

简介:
+关注继续查看

概述:运行在 JVM 上的 SQL 函数和存储过程
总所周知,有些数据库没有强大的分析函数(eg. Mysql), 有些数据库没有存储过程(eg. Vertica),当遇到复杂的数据计算,往往只能通过 Python,R 等外部脚本来实现,但这些脚本语言和主流工程语言(Java)集成性不好,如果直接用工程语言实现类似 SQL 函数和存储过程的功能,经常只是针对某个计算需求编写冗长的代码,代码几乎不可复用。

另外,即便拥有强大的分析函数,实现稍复杂的逻辑其实也不算容易,比如下面这种常见的业务计算,找出“销售额占到一半的前 n 个客户,并按销售额从大到小排序”,在 Oracle 中 SQL 实现如下:
with A as
(selectCUSTOM,SALESAMOUNT,row_number() over (order by SALESAMOUNT) RANKING
from SALES)
select CUSTOM,SALESAMOUNT
from (select CUSTOM,SALESAMOUNT,sum(SALESAMOUNT) over (order by RANKING) AccumulativeAmount
from A)
where AccumulativeAmount>(select sum(SALESAMOUNT)/2 from SALES)
order by SALESAMOUNT desc
说明:按照销售额累计值从小到大排序,通过累计值大于“一半销售额”的条件,逆向找出占到销售额一半的客户。为了避免窗口函数在计算累计值时对销售额相同的值处理出现错误,用子查询先计算了排名。

下面是用集算器实现相同逻辑的代码:
1
从上述代码我们可以看到,集算器利用一套简洁的语法取代了需嵌套 SQL+ 窗口函数才能实现的逻辑,并且具有通用一致性(任何数据源代码一致)。

集算器是一套运行在 JVM 上专门处理结构化数据的脚本语言,类似用 SQL 函数和存储过程,与 Java 集成可以创建可移植、功能强大和与数据库无关的计算逻辑,运行于中间层的计算逻辑和运行于数据库层的数据逻辑之间的分离,提高了应用程序的可扩展性、灵活性和可维护性。

应用场景:报表数据准备
应用结构
2
集成后,集算器嵌入报表应用层,相当于本地的逻辑数据库(不需要单独服务器部署),在报表与数据源间作为报表数据准备层,完成各种复杂的计算任务。

如何集成
下面以 Vertica 为数据源,Birt 为报表工具,描述怎样集成 esProc 作为数据准备层。

(一) Birt 开发环境

1、 基础 jar 集成

集算器 JDBC 需要三个基础 jar 包,都可以在 [esProc 安装目录]esProclib 目录下找到,分别为:
dm.jar 集算器计算引擎及JDBC驱动包
jdom.jar 解析配置文件
icu4j_3_4_5.jar 处理国际化
除了基础包外,还有一些为完成特定功能的 jar 包。如,要在集算器 JDBC 用其它数据库作为集算器的数据源,那么还需要相应数据库的驱动 jar 包,本文涉及到 vertica,所以要同时增加其 JDBC 驱动包(以 vertica9.1。0 为例)

vertica-jdbc-9.1.0-0.jar vertica 官网即可下载

获取到以上 Jar 后,将其拷贝至 Birt 开发环境 [安装目录]pluginsorg.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。

注意:标红部分,不同 birt 版本略有不同

2、 配置文件集成

raqsoftConfig.xml,主要包含集算器授权、脚本文件路径、其他作为集算器数据源的连接配置等。

可在 [esProc 安装目录]esProcconfig 下找到,需复制后放置在类路径下,同样将其拷贝至 Birt 开发环境 [安装目录]pluginsorg.eclipse.birt.report.data.oda.jdbc_4.6.0.v20160607212 下。

注意:配置文件名不能改变

(二) Birt 应用环境

1、 将(一)中的所有 jar 拷贝至应用的 WEB-INFlib 下

2、 将 raqsoftConfig.xml 拷贝至应用的 WEB-INFclasses 下

例一:常规调用
1、 Vertica 内 Sales 表字段及数据说明(通过 vsql 查询,本测试库有 2013/14/15 年数据)
3
2、 编写并部署 esProc 脚本

(1) esProc 设计器添加 vertica JDBC 驱动包

vertica 官网下载 jdbc 驱动包(如,vertica-jdbc-9.1.0-0.jar),放至【esProc 安装目录】commonjdbc 下

(2) 新增 vertica 数据源

打开设计器,Tool—Datasource connection 新增 JDBC 方式连接
4
点 ok 保存,再点 connect 连接
5
数据源名称变为粉色即表示连接成功。

(3) 编写算法脚本 (文件:VerticaExternalProcedures.dfx)
6
(4) 部署脚本

将脚本文件部署到 raqsoftConfig.xml 配置的脚本文件主目录下。
7














4、 Birt 开发工具内新建报表,并增加 esProc 数据源“esProcConnection”
8
Driver class 为”com.esproc.jdbc.InternalDriver(v1.0)”,会用到 dm.jar 等
Database URL 为”jdbc:esproc:local://”

5、 Birt 调用 Vertica 外部存储过程(esProc 数据集)

新建“Data Sets”,选择配置的集算器数据源(esProcConnection),数据集类型选择存储过程(SQL Stored Procedure Query)
9
Next,查询脚本(Query-Query Text)输入:{call VerticaExternalProcedures()}
10
其中:VerticaExternalProcedures 为 esProc 脚本文件名

Finish,预览数据(Preview Results)
111
此时,便看到了把 esProc 脚本作为 Vertica 外部存储过程取数辅助计

算的过程。

6、 Birt Web 端呈现

以简单的网格报表为例

报表设计如下
12
Web 发布预览
13
例二:参数调用
这里把“找出订单销售额占到一半的前 n 个客户,并按销售额从大到小排序”,改为要求按年查询,即“按年度查询订单销售额占到一半的前 n 个客户,并按销售额从大到小排序”,因此增加了参数过滤功能。

下面看下具体的改法:

1、 esProc 脚本增加按年度参数及过滤功能

打开 esProc 设计器,Program – Parameter – Add

参数名为“qyear”(可与报表参数名不同)
14
脚本改动:
15
注:A2 增加条件过滤

2、 报表内增加年度参数

报表增加按年查询的入口参数,参数名为“qyear”

开发工具打开报表,Data Explorer – Report Parameter – new patameter
16
Default value 为 qyear 的默认值。

3、 报表数据集增加数据集参数并与报表参数绑定

Data set 内编辑 VerticaExternalProcedures 数据集
17
Query Text 改为“{call VerticaExternalProcedures(?)}”,? 为入口参数年

度,此处用占位符设置。

选 Parameters,增加数据集参数 qyear 并与报表参数 qyear 绑定。
18
Preview Results, 这里根据 qyear 默认值仅有查询 2013 年数据
19
改为“2015”后
20
4、 Web 端预览
21
查询“2015”年数据
22
修改或 url 传入 qyear 为“2013”年后
23
更多 "birt 整合方案" 详见:http://c.raqsoft.com.cn/tag/Report

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
堆排序(Heap Sort)
算法介绍 算法描述 图片演示 动图演示 算法分析 代码实现 参考
23 0
美团优选大数据开发岗面试真题-附答案详细解析(一)
美团优选大数据开发岗面试真题-附答案详细解析
294 0
大数据平台搭建神器,Ambari HDP集群搭建全攻略
大数据平台搭建神器,Ambari HDP集群搭建全攻略
1821 0
谈谈Spring Boot 数据源加载及其多数据源简单实现
业务需求 提供所有微服务数据源的图形化维护功能 代码生成可以根据选择的数据源加载表等源信息 数据源管理要支持动态配置,实时生效附录效果图 实现思路 本文提供方法仅供类似简单业务场景,在生产环境和复杂的业务场景 请使用分库分表的中间件(例如mycat)或者框架 sharding-sphere (一直在用)等 先来看Spring 默认的数据源注入策略,如下代码默认的事务管理器在初始化时回去加载数据源实现。
1227 0
【流数据与大屏DataV】如何使用DTS,Datahub,StreamCompute,RDS及DataV搭建流数据大屏
本文主要从数字化大屏的价值及实现两方面阐述了数字化大屏的制作过程。
3514 0
测试9——为何在数据库在mount阶段可以查询v$datafile_header 视图
大家都知道只有当数据库进入到OPEN状态时,数据文件才被打开,才能读取其中的内容.那在mount状态下,就可以读取v$datafile_header中的信息,为什么呢? 这说明当从nomount状态进入mount状态时,还是扫描了一下数据文件头中的内容的,而且将相应的信息存储到了控制文件中(因为有网友说通过dump control file可以看到http://www.itpub.net/thread-1153987-1-1.html)。
952 0
数据库 count和sum区别
最近备考软考,复习数据库时候,发现count和sum,貌似差不错。就仔细查了查。             表 人     id name number     1 贱人 3     2 好人 4  select count(number) from 人; ----执行之后结果为:2 (表示有2条记录)  select sum(number) from 人;---执行之后结果为:7(表示各记录number之和为7)     ,一个是记录,一个是总数量。
798 0
090615 T 数据库范式
帮助记忆五级范式:    一级范式:        消除每个表格中重复的组。        为每套相关的数据建立一个独立的表格。        使用一个主键来标识每套相关的数据。    二级范式:        为应用在多条记录的字段建立独立的表格。
711 0
+关注
85
文章
5
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载