集算器提升Java的计算能力
2014-07-17 14:53
211 查看
JAVA语言是使用最广泛的编程语言,具备优秀的架构体系,是企业级应用首选的开发语言。但是JAVA语言不擅长批量数据计算,一旦遇到单句SQL难以写出的复杂计算,或者不允许在数据库添加存储过程时,JAVA的缺陷就会显现出来:没有专业的库函数,缺乏简洁的运算语法,代码冗长不易读,对技术能力要求苛刻。集算器是JAVA架构的新一代查询语言,具备JDBC接口,能够全面提升JAVA的计算分析能力。
某商业银行的JAVA架构的信息系统中,需要计算本年度每个月的贷款额的移动平均值(MA)。原始数据存储在数据库的loan table里,主要字段是贷款时间:time、贷款额:amount。部分数据如下图:
移动平均值的算法为:相邻3个月的平均值,比如3月份的移动平均值是2,3,4这三个月的平均值;另外第一条和最后一条数据只有相邻的2个月。
每个月的贷款额比较容易计算,只需用SQL对时间按月进行分组,并对贷款额求和。但“移动平均值”会涉及到”相对位置”和”行间运算”,因而不易用SQL表达,而且银行的数据库中不能轻易添加存储过程,因此传统上都是通过JAVA计算的。 用JAVA代码写:
先进行分组汇总计算,这个可用SQL完成,剩下的求移动平均值由JAVA处理。JAVA需要循环遍历结果集,分三种情况做处理:第一条数据,只对当前和下一条做平均;最后一条数据,对当前和上一条做平均;其他情况,对当前、上一条、下一条做平均。JAVA是传统的做法,现在有了集算器,我们可以试试这个新选择。 集算器配合JAVA解答
首先,在集算器设计器中进行数据计算:A1执行简单的分组汇总SQL;A2继续加工:计算移动平均值,这里”~”表示分组中的每条记录,”{startPosition,endPosition}”表示相对的区间范围,”{-1,1}”表示相对于当前记录,从-1位置到1位置共3条记录。我们把上述网格文件存为”ma3.dfx”,然后在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系统无缝集成,共同构建可集群、跨平台、健壮的应用系统。集算器是操作简便功能强大的计算中间件,可以快速解决业务中的计算难题,从而显著减少时间成本和人力成本。
相关文章推荐
- paip.提升用户体验--提升java的热部署热更新能力
- 集算器实现JAVA动态可挂接计算模块
- 看了后让你代码思维和能力提升的 Java 源代码
- 提升能力,挑战自我-----------------注:刚工作的JAVA程序员
- 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
- 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
- 集算器用作Java结构化文件计算类库
- JAVA从菜鸟【入门】到新手【实习】一一后PC时代软硬件协同设计能力:可穿戴计算:硬件方向:电路基础
- CCF计算机软件能力认证试题练习-日期计算(Java参考答案学习记录)
- 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
- Java中的byte,short,char进行计算时都会提升为int类型。
- paip.提升用户体验--提升java的热部署热更新能力
- CCF计算机软件能力认证试题练习-折点计算(Java参考答案学习记录)
- 集算器跨库计算能力解决报表内计算慢的问题
- 有哪些 Java 源代码看了后让你收获很多,代码思维和能力有较大的提升?
- Groovy超强的Java动态计算能力
- 集算器用作Java结构化文件计算类库
- 牛客网-专业IT笔试面试备考平台,最全C++JAVA前端求职题库,全面提升IT编程能力
- 提升Hadoop计算能力的并行框架
- 集算器用作Java计算类库的应用结构