JAVA语言是使用最广泛的编程语言,具备优秀的架构体系,是企业级应用首选的开发语言。但是JAVA语言不擅长批量数据计算,一旦遇到单句SQL难以写出的复杂计算,或者不允许在数据库添加存储过程时,JAVA的缺陷就会显现出来:没有专业的库函数,缺乏简洁的运算语法,代码冗长不易读,对技术能力要求苛刻。
集算器是JAVA架构的新一代查询语言,具备JDBC接口,能够全面提升JAVA的计算分析能力。
某商业银行的JAVA架构的信息系统中,需要计算本年度每个月的贷款额的移动平均值(MA)。原始数据存储在数据库的loan table里,主要字段是贷款时间:time、贷款额:amount。部分数据如下图:
移动平均值的算法为:相邻3个月的平均值,比如3月份的移动平均值是2,3,4这三个月的平均值;另外第一条和最后一条数据只有相邻的2个月。
每个月的贷款额比较容易计算,只需用SQL对时间按月进行分组,并对贷款额求和。但“移动平均值”会涉及到”相对位置”和”行间运算”,因而不易用SQL表达,而且银行的数据库中不能轻易添加存储过程,因此传统上都是通过JAVA计算的。
用JAVA代码写:
...... st=conn.prepareStatement("select sum(amount)amount, to_char(time,'MM')month from loan whereto_char(time,'yyyy')=to_char(sysdate,'yyyy') group by to_char(time,'MM') orderby month",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ResultSet rs=st.executeQuery(); int size=rs.getFetchSize(); for(int currentPos=1;currentPos<=size;currentPos++){ rs.absolute(currentPos); float preAmount=-1,thisAmount=-1,nextAmount=-1; float avgAmount=-1; String month=rs.getString("month"); thisAmount=rs.getFloat("amount"); if(currentPos==1){ rs.next(); nextAmount=rs.getFloat("amount"); avgAmount=(thisAmount+nextAmount)/2; }elseif(currentPos==size){ rs.previous(); preAmount=rs.getFloat("amount"); avgAmount=(thisAmount+preAmount)/2; }else{ rs.previous(); preAmount=rs.getFloat("amount"); rs.next(); rs.next(); nextAmount=rs.getFloat("amount"); avgAmount=(thisAmount+nextAmount+preAmount)/3; } System.out.println(month+""+avgAmount); } rs.close(); ……
先进行分组汇总计算,这个可用SQL完成,剩下的求移动平均值由JAVA处理。
JAVA需要循环遍历结果集,分三种情况做处理:第一条数据,只对当前和下一条做平均;最后一条数据,对当前和上一条做平均;其他情况,对当前、上一条、下一条做平均。
JAVA是传统的做法,现在有了集算器,我们可以试试这个新选择。
集算器配合JAVA解答
首先,在集算器设计器中进行数据计算:A1执行简单的分组汇总SQL;A2继续加工:计算移动平均值,这里”~”表示分组中的每条记录,”{startPosition,endPosition}”表示相对的区间范围,”{-1,1}”表示相对于当前记录,从-1位置到1位置共3条记录。
我们把上述网格文件存为”ma3.dfx”,然后在JAVA中调用计算结果:
…… st=conn.prepareCall("callma3()"); st.execute(); ResultSet rs = st.getResultSet(); ……
JAVA通过标准的JDBC接口,以存储过程的形式调用集算器,其中存储过程名就是网格文件名。
比较
从例子中可以看出,只用JAVA进行解答时,运算逻辑复杂,代码量大、不易维护。比如进一步求相邻5个月的移动平均值,或任意N个月的移动平均值,代码几乎要重写才可以实现。事实上,为了便于使用,还需要写更多的代码把目前的返回值类型转化为”List+Map”或”ResultSet”。
集算器是专业的批量数据计算工具,具有敏捷的语法和强大的库函数,可以轻松解答本案例。集算器也容易扩展维护,比如求5个月的移动平均值,只需要把A2中的数据区间从{-1,1}改成{-2,2};求N个月的移动平均值,只需要用传入的参数替换区间。最后,集算器的结果集本身就是易用的”ResultSet”类型,方便JAVA直接使用。
集算器能够大大提升JAVA的计算分析能力,这是由集算器的一些特性决定的。
特性:JDBC接口
集算器由纯JAVA编写而成,提供了易用的JDBC开发接口,可以方便地被各类JAVA程序调用(比如报表),也可以被JAVA语言以嵌入式数据库的形式调用。集算器的调用方式遵循公开的JDBC接口规范,以存储过程的形式被调用,调用前可接收参数,调用后可返回多个结果集。
特性:专业的计算能力
集算器是专业的批量数据分析工具,具备SQL的全部计算能力,可以对数据进行查询、过滤、分组,统计;也可以输入参数或进行循环、分支判断;除了数据库,还可以直接对Excel及文本文件中的数据进行分析。
集算器的价值
集算器集算器提供友好易用的JDBC接口,可以被JAVA语言方便地调用,显著提升JAVA的计算能力。
集算器由纯JAVA开发而成,天然具备架构优势,可以和外部JAVA系统无缝集成,共同构建可集群、跨平台、健壮的应用系统。
集算器是操作简便功能强大的计算中间件,可以快速解决业务中的计算难题,从而显著减少时间成本和人力成本。