专业的编程技术博客社区

网站首页 > 博客文章 正文

帆软报表功能开发-批量数据自定义提交STARROCKS

baijin 2024-09-11 00:47:14 博客文章 6 ℃ 0 评论

1. 功能需求

随着业务数据量的不断增长,帆软报表需要展示的数据内容越来越多,如何快速加载并渲染出表格数据,以供业务人员了解业务并进行业务分析是亟需解决的问题。

目前,公司所采用的数据架构是由ORACLE作为数据存储及分析引擎,帆软REPORT作为业务数据的前端报表展示平台来支撑各个业务条线开展工作。同时,在日常的业务报表开发过程中发现,当单表或者多表关联查询数据量超过100万条以上,数据库性能将会成为制约前端报表展示的瓶颈。为了解决报表查询展示慢的问题,公司引进了STARROCKS作为新的数据存储及分析引擎,以支撑千万级、上亿级数据报表的查询展示需求。STARROCKS作为一款OLAP数据分析引擎,在一定条件下(创建主键表)可以支持数据的增删改查功能,可以视为海量数据(上千万级、亿级)场景下的MYSQL数据库的一种替代工具。

在报表的有一类应用场景,即需要将报表的表格数据提交到STARROCKS数据库,如果直接采用帆软报表提供的内置SQL提交功能,在提交的数据量大的情况下会报错,提示如下信息:

即向STARROCKS提交的版本数太多造成数据写入报错,无法完成数据的完整写入。因为帆软REPORT的“内置SQL”提交功能默认对每条记录进行一次写入操作(比如写入1万行数据,则会向STARROCKS提交1万次版本)。

2. 方案设计

帆软REPORT的“报表填报属性”除了提供“内置SQL”提交数据库的方式外,还支持“自定义提交”的功能,即在点击提交按钮后,获取到填报页面的数据做一些自定义的处理。

帆软REPORT自定义提交实现方式可以参考FinReport官方文档:https://help.fanruan.com/finereport/doc-view-3703.html。STARROCKS批量提交数据的实现方式可参考GITHUB上STARROCKS开发文档: https://github.com/StarRocks/demo/blob/master/MiscDemo/stream_load/java/StarRocksStreamLoad.java。

方案整体实现流程是:首先选中“报表填报属性”下拉菜单,并选择“自定义提交”方式;然后选择“后台类提交”,重写帆软自定义提交的JAVA类DefinedSubmitJob并进行编译,直到编译成功并保存;最后,将报表需要提交的数据通过“属性”栏的“增加属性”列将报表表格数据与自定义提交的JAVA类进行绑定。

3. 工程实现

工程实现难点主要包括:1.如何将自定义提交JAVA代码需要引用的JAR包引入帆软REPROT工程;2.如何获取帆软报表单元格数据,如何实现单元格数据批量提交逻辑;3.如何对自定义提交功能开发代码进行调试。

3.1引入STARROCKS数据写入相关JAR包

参考StarRocksStreamLoad.java代码发现需要引用的JAR包主要是http提交的相关类及JDK相关类,即:

在帆软工程中,已经包括了JDK相关JAR包,需要额外引入HTTP相关JAR包,包括:httpcore-4.4.13.jar,httpclient-4.5.13.jar,commons-codec-1.11.jar。并将这三个JAR包放入帆软工程的JAR目录。

3.2帆软REPROT自定义提交功能逻辑实现

参考帆软自定义提交示例代码SubmitDemo.java,自定义提交Starrocks功能需要继承DefinedSubmitJob类,并自定义实现doJob方法。

自定义提交JAVA代码通常放在帆软REPROT工程classes\com\fr\data文件目录下。

3.2.1自定义提交属性数据获取

自定义提交属性数据获取方法包括不限于报表单元格数据、数据库查询数据、常量数据等。

获取报表单元格数据,报表单元格数据通过单元格位置进行引用,例如A列2行标识client_id单元格数据。

获取数据库查询数据,在“自定义提交”中通过引用函数来获取数据库值,例如rows_count字段通过函数VALUE(“ds2”,1,1)获取数值:

获取常量数据,常量数据直接在“自定义提交”中通过增加属性列的方式获取,常量支持的数据类型包括“字符串”、“整型”、“双精度型”,“日期”,“布尔型”等,通常常量属性设置为字符串型,这样做的目的是避免数据类型转换错误造成的报错,同时,字符串类型可以灵活的转换成其他数据类型,具备通用性。

3.2.2批量提交STARROCKS功能实现逻辑

自定义提交代码变量关联自定义提交属性。自定义提交属性名字应该和代码中变量名称一致,除了单元格属性数据类型默认JobValue外,其他数据类型建议都设置为String类型,避免帆软自定义数据类型与JAVA通用数据类型不匹配报错。

批量获取自定义提交表格属性数据。帆软REPORT自定义提交开发示例代码只提供了doJob方法供用户进行二次开发,该方法是在每次获取一条数据后进行调用。为了实现批量提交功能,需要在FrSubmitStarrocks类中创建一个静态列表,在每次调用doJob方法时将每行的所有属性数据进行装载。需要特别注意的是报表单元格数据可能为空的情况,为了避免帆软自定义的对象数据类型与JAVA数据类型不一致的情况,统一将单元格属性数据转换成String类型(调用toString()方法),当单元格数据为空时,通过toString()方法进行转换后,JobValue属性对象的值为空字符串。

批量提交报表表格数据到STARROCKS。获取数据总行数(自定义提交属性,即变量fr_data_count),每批次提交数据行数(自定义提交属性,即变量insert_batch),当前已获取数据条数(创建一个静态变量fr_data_idx来记录当前数据行数)。同时,通过判断1.当前数据行数是否达到提交批次(即fr_data_idx对insert_batch取余数为零),2.当前数据行数是否是最后一条数据(即fr_data_idx等于fr_data_count,通过fr_data_idx小于(fr_data_count+1)来进行判断,避免数值型变量进行等值比较会出现精度无法匹配问题)。通过调用StarRocksStreamLoad.java官方代码中的大批量数据提交方法this.sendData()完成批量数据提交。

3.3自定义提交功能代码开发调试

当完成代码开发并编译成功后,下一步则是验证自定义提交STARROCKS数据是否成功。由于帆软REPORT软件无法对代码进行断点调试,只能通过在代码里打印日志来判断逻辑实现是否正确,在帆软自定义提交代码中通过调用 FineLoggerFactory.getLogger().error(“---------”)打印日志。帆软REPROT日志文件是fanruan.log。

3.4特别注意事项

每次完成JAVA代码成功编译保存并进行功能测试后,如果发现代码实现逻辑有问题,在修改了JAVA代码并成功编译保存后,需重启帆软服务器再进行功能测试,若不重启服务器,修改后的JAVA代码不会生效。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表