Java程序中的数据计算

由于各种各样原因,我们经常需要在Java程序中进行数据计算处理
系统设计要求,
业务逻辑与数据存储分离
数据分散在
不同的数据源中
计算逻辑复杂,
SQL实现困难

在Java中实现数据计算的痛点

代码繁琐冗长
难以实现复杂算法
耦合性高
维护困难

一段实现简单分组统计的Java代码

这么长的代码仅仅实现了单个字段分组单个字段汇总的功能

解决办法:Java专业计算包 - 集算器

说明:SPL是esProc采用的脚本语言,dfx为脚本文件,相当于外置存储过程,Java通过JDBC接口传入SPL语句实现结构化计算或执行脚本。

专业数据计算语言SPL

  • 离散化与集合性的结合
  • 300多个结构化计算函数
  • 特色网格式代码层次清晰
  • 内存、外存游标、集群运算
  • 循环,分支适应过程式计算
  • 分步计算与完善的调试功能

丰富数据接口

  • RDB:Oracle,DB2,MS SQL,MySQL,PG,….
  • MongoDB,REDIS,…
  • Hadoop:HDFS,HIVE,HBASE
  • 内存、TXT/CSV,JSON/XML,EXCEL
  • HTTP、ALI-OTS
  • 文件SQL接口

专业Jar包

  • 标准JAR包,易于集成
  • 可多线程并行计算
  • 完善的异常处理

SPL实现分组

常规分组

汇总每个人的值班天数
A
1 =file("/Users/test/duty.xlsx").importxls@tx()
2 =A1.groups(name;count(name):count)

这类基本运算还可以直接用SQL写:

SELECT name,count(name) FROM user/test/duty.xlsx GROUP BY name

每组Top N

获取每个月、每个人、头三天的加班记录
A
1 =file("/Users/test/duty.xlsx").importxls@tx()
2 =A1.groups(month(workday):mon,name;~.top(3):top3)

对位分组

按顺序分别列出使用 Chinese、English、French 作为官方语言的国家数量
A
1 =connect("mysql")
2 =A1.query@x("select * from world.countrylanguage where isofficial='T'")
3 [Chinese,English,French]
4 =A2.align@a(A3,Language)
5 =A4.new(A3(#):name,~.len():cnt)

运算类库

专门针对结构化数据表设计

降低JAVA耦合度

JAVA硬编码

编译执行

硬编码算法必须和主应用一起编译打包

模块化困难

硬编码算法和主应用存在类依赖,难以隔离,耦合度高

编译执行

硬编码算法修改后会导致整个应用重新编译部署重启,很难做到热切换

集算器

解释执行

集算器算法无需事先编译

模块化简单

集算器脚本文件与主应用无依赖关系,可外置于JAVA,可单独维护

容易热切换

无需编译无需重启,可热切换

多样性数据源支持

JAVA计算能力难以胜任多样性数据源

集算器内置接口便捷访问

  • 商用 RDBMS:Oracle、MS SQL Server、DB2、Informix
  • 开源 RDBMS:MySQL、PostgreSQL
  • 开源 NOSQL:MongoDB、Redis、Cassandra、ElasticSearch
  • Hadoop家族:HDFS、HIVE、HBase
  • 应用软件:SAP ECC、BW
  • 文件:Excel、Json、XML、TXT
  • 其他:Http Restful、Web Services、OLAP4j 、...

跨库计算支持

标准化调用接口

Java代码

...
Connection con = null;
Class.forName(com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用存储过程,其中CountName是dfx的文件名
st =(com. esproc.jdbc.InternalCStatement)con.prepareCall("call CountName()");
//执行存储过程
st.execute();
//获取结果集
ResultSet rs = st.getResultSet();
...		
热部署外置算法有效降低耦合性

资源链接


英文版