JAVA语言是使用最广泛的编程语言,具备优秀的架构体系,是企业级应用首选的开发语言。但是JAVA语言不擅长批量数据计算,一旦遇到单句SQL难以写出的复杂计算,或者不允许在数据库添加存储过程时,JAVA的缺陷就会显现出来:没有专业的库函数,缺乏简洁的运算语法,代码冗长不易读,对技术能力要求苛刻。

集算器是JAVA架构的新一代查询语言,具备JDBC接口,能够全面提升JAVA的计算分析能力。

java Polygon数据处理_嵌入式

某商业银行的JAVA架构的信息系统中,需要计算本年度每个月的贷款额的移动平均值(MA)。原始数据存储在数据库的loan table里,主要字段是贷款时间:time、贷款额:amount。部分数据如下图:

java Polygon数据处理_java_02

移动平均值的算法为:相邻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解答

java Polygon数据处理_java Polygon数据处理_03

首先,在集算器设计器中进行数据计算: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系统无缝集成,共同构建可集群、跨平台、健壮的应用系统。

集算器是操作简便功能强大的计算中间件,可以快速解决业务中的计算难题,从而显著减少时间成本和人力成本。


https://blog.51cto.com/report5/1439514